Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么hasOne关系中的外键需要位于引用表中?_Sql_Laravel_Eloquent - Fatal编程技术网

Sql 为什么hasOne关系中的外键需要位于引用表中?

Sql 为什么hasOne关系中的外键需要位于引用表中?,sql,laravel,eloquent,Sql,Laravel,Eloquent,为什么Laravel雄辩地坚持hasOne关系中的外键必须在引用表中,而不是在父表中 我要求大家普遍理解/充实 例如,根据Laravel文档:如果一个用户有一个电话,那么电话型号应该有一个用户id外键 这似乎需要数据库做更多的工作:在Phones表中查找user\u id,而user模型上已经存在phone\u id 我假设以下三个原因都适用-还有其他原因可以这样构建吗? 它可以利用已经编写好的查找逻辑,并且有很多关系(很明显,为什么需要这样做) 该关系可以很容易地“迁移”到具有多个关系的数据

为什么Laravel雄辩地坚持hasOne关系中的外键必须在引用表中,而不是在父表中

我要求大家普遍理解/充实

例如,根据Laravel文档:如果一个
用户
有一个
电话
,那么
电话
型号应该有一个
用户id
外键

这似乎需要数据库做更多的工作:在
Phones
表中查找
user\u id
,而
user
模型上已经存在
phone\u id

我假设以下三个原因都适用-还有其他原因可以这样构建吗?

  • 它可以利用已经编写好的查找逻辑,并且有很多关系(很明显,为什么需要这样做)
  • 该关系可以很容易地“迁移”到具有多个关系的数据库
  • 它保证只要存在关系,
    手机
    模型实际上也存在。(否则,
    User
    模型中的
    phone\u id
    可能会指向
    Phones
    表中不存在的条目。)

Laravel有一个
hasOne
关系和
belongsTo
关系

在您的示例中,如果
A
具有
b_id
列,则
A
属于
b

如果
B
有一个
a\u id
列,则
a
有一个或多个
B
取决于
B
应该有多少个

资料来源:


Laravel有
hasOne
关系和
belongsTo
关系

在您的示例中,如果
A
具有
b_id
列,则
A
属于
b

如果
B
有一个
a\u id
列,则
a
有一个或多个
B
取决于
B
应该有多少个

资料来源:

这似乎是数据库要做的更多工作:在Phones表中查找用户id,而不是用户模型中已经存在一个phone id

你在这里提到的是所谓的归属关系,实际上是HasOne或HasMany的倒数。这意味着,如果用户有一部或多部手机,则手机会通过
User\u id
外键自动属于用户。这也意味着一部手机永远只属于一个用户

HasOne和HasMany之间的相似性是非常正确的,因为它们使用外键的方式完全相同。事实上,Eloquent的唯一真正区别在于,对于HasOne,它返回引用表中的第一个匹配项,而不是HasMany中的所有可用匹配项

请注意,您的第三点并不完全正确,因为
phones
表中的
user\u id
尽可能不指向
users
中的现有条目,除非数据库中存在强制您使用外键指向现有条目的约束

这似乎是数据库要做的更多工作:在Phones表中查找用户id,而不是用户模型中已经存在一个phone id

你在这里提到的是所谓的归属关系,实际上是HasOne或HasMany的倒数。这意味着,如果用户有一部或多部手机,则手机会通过
User\u id
外键自动属于用户。这也意味着一部手机永远只属于一个用户

HasOne和HasMany之间的相似性是非常正确的,因为它们使用外键的方式完全相同。事实上,Eloquent的唯一真正区别在于,对于HasOne,它返回引用表中的第一个匹配项,而不是HasMany中的所有可用匹配项


请注意,您的第三点并不完全正确,因为
phones
表中的
user\u id
尽可能不指向
users
中的现有条目,除非数据库中存在约束,强制您的外键指向现有条目。

有点密集读取,但请检查。您所描述的与其说是一个Laravel问题,不如说是一个数据设计问题。它的缺点是,如果您在同一个表中有外来id,那么它“属于另一个记录”,但是如果本地键在一个外来表中,那么该记录“有一个/多个其他记录”。您所描述的与其说是一个Laravel问题,不如说是一个数据设计问题。简而言之,如果您在同一个表中有外来id,则它“属于另一条记录”,但如果本地密钥位于外来表中,则该记录“具有一条/多条其他记录”。这也意味着一部手机将只属于一个用户。这是对为什么会这样做的精明洞察。这也意味着一部手机永远只属于一个用户。这是对为什么会这样做的精明洞察。谢谢。