Laravel:belongsTo()关系假设一对多关系而不是一对一

Posted

技术标签:

【中文标题】Laravel:belongsTo()关系假设一对多关系而不是一对一【英文标题】:Laravel: belongsTo() relation assume one-to-many relationship instead of one-to-one 【发布时间】:2013-07-12 08:39:19 【问题描述】:

我在使用 Laravel 的 ORM 时遇到了一个乏味的问题。

我有一个具有多个关系的模型,如下所示:

class Pages extends Eloquent 

    protected $guarded = array('id','config_id');

    public function template()
    
        return $this->belongsTo('Templates', 'templates_id');
    

    public function updateUser()
    
        return $this->belongsTo('Users', 'updated_by');
    

现在我可以通过简单的方式访问模板相关项,如下所示:

$this->template->name;

而且它很容易工作,因为 Laravel 的 ORM 假定它是一对一的关系并在内部调用 first() 方法。

但是当我尝试对 updateUser 进行相同操作时,它失败了,返回一个错误,说它不能在非对象上调用 name。

但如果我试试这个:

$this->updateUser()->first()->name;

它有效,但我觉得不对。

所以我的问题是,Laravel 的 ORM 如何决定用 belongsTo() 定义的关系是一对一还是一对多?有没有办法强制执行所需的行为?

谢谢

【问题讨论】:

您是否使用hasOne() 在其他地方设置关系?你读过documentation吗? 是的,我已阅读文档。我没有在其他地方使用 hasOne() ,因为单个用户可能是许多页面的更新者,从用户的角度来看这是一对多的关系,但从页面的角度来看是一对一的关系。 【参考方案1】:

您需要定义关系。您可以在透视图中定义“不同”关系。

->belongsTo() 函数是一个反函数 - 但您没有在 users 表上定义任何内容 - 所以假设反函数是一对多是错误的。

只需将其添加到您的用户类中:

class Users extends Eloquent 

    public function pages()
    
        return $this->hasMany('Pages');
    

【讨论】:

好吧,我好像漏掉了一块,谢谢你的澄清! 对不起,我没有得到你的答案......这是否意味着我需要始终定义关系的倒数才能使其工作?如果我不想从其他模型建模关系怎么办?

以上是关于Laravel:belongsTo()关系假设一对多关系而不是一对一的主要内容,如果未能解决你的问题,请参考以下文章

Laravel5.6 Eloquent ORM 关联关系,一对一和一对多

laravel 雄辩的关系一对多返回 null

Laravel Eloquent,返回带有“belongsTo”对象的 JSON?

Laravel 5.5中的一对多关系

如何在 laravel 中以一对一的关系更新?

使用关系名称“用户”时,BelongsTo 关系返回 null