我应该在Laravel中使用EmiratesTo或hasOne吗?


74

考虑两个模型AB

A-> relatedToB是一个one to one关系

使用(A-> hasOne-B)和(A-> belongsTo-B)有什么区别?

我可以互换使用吗?

Answers:


189

不,区别取决于您的外键在哪里。

在您的示例中,如果Ab_id列,则A belongsTo B

如果B有一a_id列,然后A hasOnehasMany B取决于有多少B应该有。


26
谢谢。您是唯一一个在键位置方面进行解释的人。其他人都试图用“英语”来解释它,但是有时候您的模型太抽象了,甚至无法理解。
mpen

B也不能BelongTo A吗?
扎基·阿齐兹

3
假设Ab_id专栏。在这种情况下,我可以使用A.belongsTo(b)B.hasOne(A)。在这两种情况下,ORM都会添加b_idA表中。那么,这里有什么区别?你能解释一下吗?
弗拉迪斯拉夫·图拉克

1
这两个关系只是彼此相反。没错,他们基本上是同一回事。但是,如果您需要查询B但只设置id A,则同时设置这两个选项将很有用,那么您将需要执行诸如A::find($id)->B使用该A.belongsTo(b)关系的操作。反之,如果您需要查询一个,A但您仅有的是一个的ID B,那么您将需要B.hasOne(A)关系B::find($id)->A
user1669496

1
问题特别是关于hasOne和belongsTo之间的区别。
user1669496

76

主要区别如下:

belongsTobelongsToMany-你告诉Laravel,该表认为,它连接到其他表的外键。

hasOnehasMany-你告诉Laravel,该表没有外键。


3
我认为您的答案更简单易懂。谢谢!
阿列克谢·沙布拉莫夫

我不认为这是完全正确的。一belongstoMany(许多一对多)的关系不保持对表本身的关键,但在数据透视表。
马丁

很好的答案,这有助于理解函数名称背后的逻辑。
developerbmw

0

包含外键的模型的表中将具有belongsTo(),而包含外键的模型的表中包含该外键引用的主键将具有hasOne()...具有外键的模型将很容易具有belongsTo(),并且在该关系中不包含外键的那个将具有hasOne()。不,它们不能使用错误的方法互换,因此将始终返回null。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.