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 【问题描述】:

谁能告诉我两者的主要区别是什么BelongsToHasOne 关系在 eloquent 中。

【问题讨论】:

[这个解释帮助了|inlehmansterms.net/2014/07/28/has_one-vs-belongs_to/]我更好地理解了关系 【参考方案1】:

主要区别在于关系的哪一方持有关系的外键。调用$this->belongsTo()的模型是one-to-onemany-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 关系的逆。 以UserPhone 模型为例。

我给出了从用户到电话的 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 了解更多详情。

【讨论】:

据我了解,从数据库的角度来看,使用belongsTohasOne 或两者都没有区别。假设我们有两个表ABA 表有b_idB 表的外键。为了实现这个逻辑,我可以使用A.belongsTo(B)B.hasOne(A) - 这些关系中的任何一个都会在A 表上创建b_id。那么,同时使用这两个关系的主要思想是能够从两个模型中填充我们的值?使用A,我将能够填充B,反之亦然。我对吗?非常感谢。【参考方案3】:

一对一关系:作为用户,您可以拥有一个 (hasOne) 个人资料。当然,反过来也适用。个人资料(belongsTo)用户。一个用户不能拥有多个个人资料,而且一个个人资料不能属于多个用户。

【讨论】:

【参考方案4】:

在这里你可以看到一个很好的例子,看看 BelongsToHasOne 关系在 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

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

Laravel - 从 ajax 响应数据中的产品 (belongsTo) 访问子类别。

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

Laravel Eloquent 中的 Audit belongsTo 关系