Laravel 5.1 - BelongsTo关系返回null

时间:2015-12-25 01:05:01

标签: php oop laravel eloquent relationship

\应用\用户

class User

public function status() {

    return $this->belongsTo('App\UserStatus', 'user_status_id', 'id');
}

\应用\ UserStatus

class UserStatus

protected $fillable = ['id'];

public function user() {

    return $this->hasMany('App\User', 'user_status_id', 'id');
}

我已经从一个带有一些字段的简单$user查询中获得了User::find()对象,然后我尝试通过使用status方法延迟加载来访问$user->load('status')对象。

我正在关注文档,但由于$user->status仍然返回null,因此它似乎无用。

public function foo(User $user) {

    $user->load('status');
    $user->status // returns null
}

我做错了什么?

---------解决方案---------

实际上,为了延迟加载任何关系,外键值需要存储在模型对象中。

在我的find操作中,我没有查询user_status_id字段。当我将此字段添加到查询中时,$user->status语句开始返回UserStatus模型。

我认为这些信息不是写在Laravel文档上的,可能很简单,但我花了一些时间才弄明白。

3 个答案:

答案 0 :(得分:4)

实际上,为了延迟加载任何关系,外键值需要存储在模型对象中。

在我的查找操作中,我没有查询user_status_id字段。当我将此字段添加到查询中时,$ user-> status语句开始返回UserStatus模型。

我认为这些信息不是写在Laravel文档上的,可能很简单,但我花了一些时间才弄明白。

答案 1 :(得分:1)

status()关系中的

替换该行
return $this->belongsTo('\App\UserStatus', 'user_status_id');

与user()的关系

return $this->hasMany('\App\User', 'user_status_id');

长话短说在App之前添加'\'并删除第三个参数,因为它不是多对多的关系。

还要确保您实际使用Eloquent,以便在模型上添加

namespace App;

use Illuminate\Database\Eloquent\Model;

class MODELNAME extends Model

并指定一个表

protected $table = 'model_table';

答案 2 :(得分:0)

我正在使用Psy Shell运行它。对于belongsTo()中的第一个参数,它可能只是Classname :: class。我遇到了无法执行belongsTo()的情况,但是如果重新启动Psy Shell,它会起作用。不过这很奇怪。