理解 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()
函数来做同样的事情。只是我应该将它们放入 user
和 category
模型中。无论如何,我什么时候应该使用hasOne()
或belongsTo()
?
【问题讨论】:
如果先搜索再询问怎么办? hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209 【参考方案1】:hasOne
是 1:1 或一对一的关系。
hasMany
是 1:n 或一对多关系。
Eloquent 中的belongsTo
方法用于定义这些关系的逆。
这些的定义将取决于您的数据模型。
在你的情况下:
你有一个Category
模型,它是hasMany
Ticket
s。
您还有一个User
模型,即hasMany
Ticket
s。
现在从票证的角度来看,您需要定义这 2 个 hasMany
关系的倒数。您将通过定义 belongsTo
来做到这一点。
所以票证belongsTo
一个User
和belongsTo
一个Category
。
回答你的问题:
从Ticket
s 的角度来看,它是 1:1 的关系,因为Ticket 模型中的外键指向1 个用户,类别外键指向1 个类别。 p>
但由于您创建的关系是 1:n(一对多)并且您还在 User 和 Category 模型上定义了它,您应该在 Ticket 模型中定义关系作为这些关系的逆,hasMany(和hasOne)的逆是belongsTo
。
在 Laravel 中定义关系时,请牢记数据库架构,并以与数据库架构中存在相同的方式定义关系。
【讨论】:
你说在我的情况下我必须使用belongsTo()
,但我使用的是hasOne()
,它按预期工作.. 那我为什么要使用belongsTo()
?
@MartinAJ 阅读我评论的最后一部分,我在其中回答了这个问题。在代码中定义关系时,请牢记数据库模式。关系是双向的。【参考方案2】:
这些相同,但有一个区别。两者都返回具有一个差异的单个关联对象。当我们将某个关系声明为 belongsTo 时,这意味着有一个数据库表具有某个其他表的外键。当我们声明 hasOne 关系时,这意味着该表的主键已被另一个表引用。将其视为父子表。当我们创建子表时,我们将每个子表引用到它的父表,对吗?这是belongsTo。当我们创建父表时,我们知道父表中的每个条目在子表中可以有一个或多个条目。这是 hasOne 或 hasMany 关系。如果您需要更多说明,可以进一步询问。
【讨论】:
【参考方案3】:无论如何,我什么时候应该使用 hasOne() 或 belongsTo() ?
如果将来可能存在一对多关系,可以将其想象成hasMany
。例如:考虑用户和电话模型。关系的性质是用户hasOne
电话,但如果您想为其扩展功能,以便用户可以注册多个电话号码,用户仍将拥有has*
关系,而电话将保持belongsTo
关系。只需考虑哪一个可能是“父”实体,并且该实体应该在方法中具有hasOne
关系。我总是将用户视为父实体,对我来说,从逻辑上讲,用户只有一张票。
此外,尝试坚持 Eloquent/Laravel/artisan 命名约定,并将模型命名为 Ticket
和另一个模型 Category
(Eloquent 和 Laravel 将在需要时解决复数,即表名)。
【讨论】:
【参考方案4】:在处理一对多关系时,您将有一个 hasMany()
和一个 belongsTo()
。
我使用的经验法则是,如果一个表有一个外键(tickets 表有一个user_id
fk)那么这个模型belongsTo
用户。
与类别相同。
所以你上面的例子,Ticket
belongsTo
User
&Category
。
相反,User
hasMany
Ticket
和类似的Category
hasMany
Ticket
【讨论】:
以上是关于理解 Laravel 中的 hasOne() 和 belongsTo() 函数的主要内容,如果未能解决你的问题,请参考以下文章
laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别
Laravel 中 BelongsTo 和 HasOne 有啥区别