【问题标题】:When to use belongsTo() and when hasOne() in laravel?在 laravel 中何时使用 belongsTo() 以及何时使用 hasOne()?
【发布时间】:2016-02-11 13:42:55
【问题描述】:

在 laravel 中定义模型之间的一对一关系时,我们会说:

class Model1 extends Model
{
     public function model2()
     { 
         return $this->hasOne('App\Model2');
     }
}

对于 Model2,我们将使用 belongsTo('App\Model1')

是否有关于如何决定我们将使用每个函数的哪一端的逻辑?

【问题讨论】:

  • 如果你正在循环 Model1::all() 或者如果你正在循环 Model2::all() 你会分别使用每个方法
  • 一个很好的例子是用户>电话。手机是属于用户的,也就是说如果用户不存在,手机本身也不应该存在。相反,用户可以丢失他的手机(手机被删除)但用户仍然存在。
  • 另外,一般来说,如果您的数据库架构中存在一对一的关系,则可以改进您的架构。并非总是如此,但往往如此。
  • @STTLCU 你能解释一下吗?
  • 当你有一对一的关系时,这意味着实体 A 有一个且唯一的实体 B 与之相关,反之亦然。我从中看到的是,A 和 B 是如此相互关联,以至于它们通常可以在不失一般性的情况下组合在一起(所以你有一个表 C,它由 A 的列加上 B 的列组成)。据我所知,在我的工作经验中,我从未使用过一对一的关系。在大学期间,也许我用过一次,但感觉很奇怪,这是一个糟糕设计的标志。最后,它被删除了。

标签: php laravel


【解决方案1】:

两者之间的区别在于外键将驻留在数据库中的位置。 belongsTo 函数应该属于其表包含外键的模型,而 hasOne 应该属于被另一个表的外键引用的模型。

两者都可以,但您应该为将来可能使用您的系统的其他开发人员保持可靠的编码实践。此外,如果您的外键级联删除,这将变得至关重要。如果删除model1,是不是也应该删除属于model1的model2?

【讨论】:

  • docs 声明相反:belongsTo 关系在具有外键 (phones) 的表中
  • @Moppo 实际上并非如此。在文档中,Phone 模型具有 Mikel 提出的 belongsTo() 方法和 user_id 外键。
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2021-12-09
  • 2020-08-13
  • 2021-03-17
  • 2021-03-18
相关资源
最近更新 更多