理解 Laravel 中的 hasOne() 和 belongsTo() 函数

Posted

技术标签:

【中文标题】理解 Laravel 中的 hasOne() 和 belongsTo() 函数【英文标题】:Understanding hasOne() and belongsTo() functions in Laravel 【发布时间】:2018-09-25 06:38:31 【问题描述】:

我要做的只是了解我应该在什么时候使用hasOne(),什么时候应该使用belongsTo()。两者似乎与我相同。例如,这是我的模型:

use Illuminate\Database\Eloquent\Model;
use App\Categories;
use App\User;


class tickets extends Model

    protected $table = "tickets";

    public function category()
    
        return $this->hasOne(Categories::class, 'id', 'category_id');
    

    public function user()
    
        return $this->hasOne(User::class, 'id', 'user_id');
    

我也可以使用belongsTo() 函数来做同样的事情。只是我应该将它们放入 usercategory 模型中。无论如何,我什么时候应该使用hasOne()belongsTo()

【问题讨论】:

如果先搜索再询问怎么办? hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209 【参考方案1】:

hasOne 是 1:1 或一对一的关系。

hasMany 是 1:n 或一对多关系。

Eloquent 中的belongsTo 方法用于定义这些关系的逆

这些的定义将取决于您的数据模型。

在你的情况下:

你有一个Category 模型,它是hasMany Tickets。

您还有一个User 模型,即hasMany Tickets。

现在从票证的角度来看,您需要定义这 2 个 hasMany 关系的倒数。您将通过定义 belongsTo 来做到这一点。

所以票证belongsTo 一个UserbelongsTo 一个Category


回答你的问题:

Tickets 的角度来看,它 1:1 的关系,因为Ticket 模型中的外键指向1 个用户,类别外键指向1 个类别。 p>

但由于您创建的关系是 1:n(一对多)并且您还在 User 和 Category 模型上定义了它,您应该在 Ticket 模型中定义关系作为这些关系的,hasMany(和hasOne)的逆是belongsTo

在 Laravel 中定义关系时,请牢记数据库架构,并以与数据库架构中存在相同的方式定义关系。

【讨论】:

你说在我的情况下我必须使用belongsTo(),但我使用的是hasOne(),它按预期工作.. 那我为什么要使用belongsTo() @MartinAJ 阅读我评论的最后一部分,我在其中回答了这个问题。在代码中定义关系时,请牢记数据库模式。关系是双向的。【参考方案2】:

这些相同,但有一个区别。两者都返回具有一个差异的单个关联对象。当我们将某个关系声明为 belongsTo 时,这意味着有一个数据库表具有某个其他表的外键。当我们声明 hasOne 关系时,这意味着该表的主键已被另一个表引用。将其视为父子表。当我们创建子表时,我们将每个子表引用到它的父表,对吗?这是belongsTo。当我们创建父表时,我们知道父表中的每个条目在子表中可以有一个或多个条目。这是 hasOnehasMany 关系。如果您需要更多说明,可以进一步询问。

【讨论】:

【参考方案3】:

无论如何,我什么时候应该使用 hasOne() 或 belongsTo() ?

如果将来可能存在一对多关系,可以将其想象成hasMany。例如:考虑用户和电话模型。关系的性质是用户hasOne 电话,但如果您想为其扩展功能,以便用户可以注册多个电话号码,用户仍将拥有has* 关系,而电话将保持belongsTo 关系。只需考虑哪一个可能是“父”实体,并且该实体应该在方法中具有hasOne 关系。我总是将用户视为父实体,对我来说,从逻辑上讲,用户只有一张票。 此外,尝试坚持 Eloquent/Laravel/artisan 命名约定,并将模型命名为 Ticket 和另一个模型 Category(Eloquent 和 Laravel 将在需要时解决复数,即表名)。

【讨论】:

【参考方案4】:

在处理一对多关系时,您将有一个 hasMany() 和一个 belongsTo()

我使用的经验法则是,如果一个表有一个外键(tickets 表有一个user_id fk)那么这个模型belongsTo 用户。 与类别相同。

所以你上面的例子,TicketbelongsToUser&Category

相反,User hasMany Ticket 和类似的Category hasMany Ticket

【讨论】:

以上是关于理解 Laravel 中的 hasOne() 和 belongsTo() 函数的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.4hasOne和belongsTo的区别

laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别

Laravel 中 BelongsTo 和 HasOne 有啥区别

我应该在 Laravel 中使用 belongsTo 还是 hasOne?

Laravel Eloquent hasOne 返回空

Laravel 通过 hasOne 获取属性