【问题标题】:Laravel 5.1 - BelongsTo relationship returns nullLaravel 5.1 - BelongsTo 关系返回 null
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我不明白你的意思。你说的FK需要存储在模型对象中是什么意思?你能告诉我们你的完整代码吗?
  • @PinoyStackOverflower 我没有代码了,因为我打开这个话题已经快两年了,抱歉。我的意思是,如果没有在模型中加载引用的“id”,就不能延迟加载关系。就我而言,我试图在对象中没有实际的user_status_id 的情况下执行$user->status()。一旦我用user_status_id 填充对象,它就被整理出来了。
【解决方案2】:

在 status() 关系中将行替换为

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

在 user() 与 this 的关系中

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';

【讨论】:

  • 您不需要在这些字符串中以 `\` 开头。此外,每个关系方法都有用于覆盖键的额外参数,而不仅仅是 belongsToMany。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2018-04-23
    • 2016-01-13
    相关资源
    最近更新 更多