【发布时间】:2016-03-31 06:40:55
【问题描述】:
\应用\用户
class User
public function status() {
return $this->belongsTo('App\UserStatus', 'user_status_id', 'id');
}
\App\UserStatus
class UserStatus
protected $fillable = ['id'];
public function user() {
return $this->hasMany('App\User', 'user_status_id', 'id');
}
我已经从带有一些字段的简单User::find() 查询中获得了$user 对象,然后我尝试通过使用$user->load('status') 方法延迟加载来访问status 对象。
我正在关注文档,但它似乎没用,因为 $user->status 仍然返回 null。
public function foo(User $user) {
$user->load('status');
$user->status // returns null
}
我做错了什么?
--------- 解决方案 ---------
实际上,要延迟加载任何关系,都需要将外键值存储在模型对象中。
在我的find 操作中,我没有查询user_status_id 字段。当我将此字段添加到查询中时,$user->status 语句开始返回UserStatus 模型。
我不认为这些信息是写在 Laravel 文档中的,它可能很简单,但我花了一些时间才弄清楚。
【问题讨论】:
-
"实际上,要延迟加载任何关系,都需要将外键值存储在模型对象中。"嗯,你说对了一半。它需要在关系中明确指定,除非它已使用标准约定命名。
-
@JoelHinz 我认为他的意思是在他的
User::find()中,他添加了一个select(),其中不包括user_status_id字段。如果没有选择外键字段,Laravel 无法连接相关模型。 -
@patricus 有可能。
标签: php oop laravel eloquent relationship