Laravel 中 BelongsTo 和 HasOne 有啥区别
Posted
技术标签:
【中文标题】Laravel 中 BelongsTo 和 HasOne 有啥区别【英文标题】:What is the difference between BelongsTo And HasOne in LaravelLaravel 中 BelongsTo 和 HasOne 有什么区别 【发布时间】:2016-10-01 15:48:53 【问题描述】:谁能告诉我两者的主要区别是什么BelongsTo 和 HasOne 关系在 eloquent 中。
【问题讨论】:
[这个解释帮助了|inlehmansterms.net/2014/07/28/has_one-vs-belongs_to/]我更好地理解了关系 【参考方案1】:主要区别在于关系的哪一方持有关系的外键。调用$this->belongsTo()
的模型是one-to-one
和many-to-one
关系中的拥有模型,并持有拥有模型的key。
一对一关系示例:
class User extends Model
public function car()
// user has at maximum one car,
// so $user->car will return a single model
return $this->hasOne('Car');
class Car extends Model
public function owner()
// cars table has owner_id field that stores id of related user model
return $this->belongsTo('User');
一对多关系示例:
class User extends Model
public function phoneNumbers()
// user can have multiple phone numbers,
// so $user->phoneNumbers will return a collection of models
return $this->hasMany('PhoneNumber');
class PhoneNumber extends Model
public function owner()
// phone_numbers table has owner_id field that stores id of related user model
return $this->belongsTo('User');
【讨论】:
可以在这里找到更简单的解释:***.com/questions/30058949/… IMO 太混乱了。如果用户只有一辆车,那么用户应该有对 car_id 的引用。如果汽车有对 user_id 的引用,那么一个用户可以被许多汽车引用——所以用户“有很多”汽车!尽管如此,它就是这样。我有 Appointment 表,我想如果 Appointment 最多有 1 个treatmentType,我不会猜到我必须使用belongsTo。 @DanielKatz 我同意用户和汽车之间关系的例子不是最好的。如果在物理上或法律上不可能同时拥有超过 1 辆汽车,则此示例将更容易理解。【参考方案2】:BelongsTo 是 HasOne 的倒数。
我们可以使用 belongsTo 方法定义 hasOne 关系的逆。 以
User
和Phone
模型为例。
我给出了从用户到电话的 hasOne 关系。
class User extends Model
/**
* Get the phone record associated with the user.
*/
public function phone()
return $this->hasOne('App\Phone');
使用这种关系,我可以使用用户模型获取电话模型数据。
但是使用 HasOne 的逆过程是不可能的。就像使用电话模型访问用户模型一样。
如果我想使用Phone访问User模型,那么需要在Phone模型中添加BelongsTo。
class Phone extends Model
/**
* Get the user that owns the phone.
*/
public function user()
return $this->belongsTo('App\User');
您可以参考此link 了解更多详情。
【讨论】:
据我了解,从数据库的角度来看,使用belongsTo
或hasOne
或两者都没有区别。假设我们有两个表A
和B
,A
表有b_id
到B
表的外键。为了实现这个逻辑,我可以使用A.belongsTo(B)
或B.hasOne(A)
- 这些关系中的任何一个都会在A
表上创建b_id
。那么,同时使用这两个关系的主要思想是能够从两个模型中填充我们的值?使用A
,我将能够填充B
,反之亦然。我对吗?非常感谢。【参考方案3】:
一对一关系:作为用户,您可以拥有一个 (hasOne) 个人资料。当然,反过来也适用。个人资料(belongsTo)用户。一个用户不能拥有多个个人资料,而且一个个人资料不能属于多个用户。
【讨论】:
【参考方案4】:在这里你可以看到一个很好的例子,看看 BelongsTo 和 HasOne 关系在 eloquent 中有什么区别。
Mahmoud Zalt 的雄辩关系备忘单 https://link.medium.com/9lj9BAG8lR
【讨论】:
【参考方案5】:如果你想在两个表之间建立一对一的关系,那么首先你必须建立“hasOne”关系,如果你想建立相反的表关系,那么你就建立“属于”......这是一个简单的区别HasOne 和 Belongs 之间的关系,如果你想知道的话
一对多(反向)
现在我们可以访问帖子的所有 cmets,让我们定义一个关系以允许评论访问其父帖子。要定义 hasMany 关系的逆关系,请在调用 belongsTo
方法的子模型上定义关系函数:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
/**
* Get the post that owns the comment.
*/
public function post()
return $this->belongsTo('App\Post');
【讨论】:
以上是关于Laravel 中 BelongsTo 和 HasOne 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
TP5 关联方法 hasOne 与 BelongsTo的区别
我应该在 Laravel 中使用 belongsTo 还是 hasOne?
Laravel - 从 ajax 响应数据中的产品 (belongsTo) 访问子类别。