Laravel 5 预加载不工作

Laravel 5 Eager Loading not working

我看了很多搜索结果都遇到了这个问题,但我无法让它工作。

用户模型

<?php namespace Module\Core\Models;

class User extends Model {

(...)

protected function Person() {
    return $this->belongsTo( 'Module\Core\Models\Person', 'person_id' );
}

(...)

人物模型

<?php namespace Module\Core\Models;

class Person extends Model {

(...)

protected function User(){
    return $this->hasOne('Module\Core\Models\User', 'person_id');
}

(...)

现在,如果我使用 User::find(1)->Person->first_name 它的工作。我可以从用户模型中获取人员关系。

但是.. User::with('Person')->get() 失败并调用未定义的 方法 Illuminate\Database\Query\Builder::Person()

我做错了什么?我需要所有用户及其个人信息的集合。

您必须将关系方法声明为 public

这是为什么?我们来看看with()方法:

public static function with($relations)
{
    if (is_string($relations)) $relations = func_get_args();

    $instance = new static;

    return $instance->newQuery()->with($relations);
}

由于该方法是从静态上下文中调用的,因此它不能只调用 $this->Person()。相反,它会创建一个新的模型实例并创建一个查询构建器实例并调用 with 等等。最后,必须可以从模型 外部 访问关系方法。这就是可见性需要 public.

的原因