一对一关联是用hasOne+belongsTo还是用hasOne+hasOne?

  • 问题1

    一对一关联是用hasOne+belongsTo还是用hasOne+hasOne?

  • 问题2

    有一个user表和user_info表,一对一的情况下user_info还需要用自增ID吗?按照我的理解是需要的自增ID的

让PHP再次伟大
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

当然是:

User hasOne UserInfo
UserInfo belongsTo User

至于为什么不能是 User hasOne UserInfoUserInfo hasOne User,我觉得你应该先了解一下 hasOnebelongsTo 的区别,我猜想你的表结构应该是如下:

user_table
id, xxx

user_info_table
id, user_id, xxx

User hasOne UserInfo 的前提是,UserInfo 表中有一个 User 的外键 user_id,如果两个模型互相都是 hasOne 关系,那你 user 表中也需要写一个 UserInfo 的外键,比如:user_info_id

hasOne 与 belongsTo 是从属关系,至于谁从属谁,就看谁的表中有另一个表的外键,比如 user_id

如果 UserInfo 非要 hasOne User,并且 User 中又没有 UserInfo 的外键,就会报错,比如:

column “user_info_id” not found in user_table

这个是遵循 Laravel ORM 自动匹配模型外键的规则,模型名称+ID。

当然如果你非要用 hasOne,又不想创建 user_info_id 外键在 User 模型中,就需要手动指定外键,那这样就和 belongsTo 没区别了

class UserInfo
{
    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
}

也可以这样来定义 hasOne 模型关系,但你看这样写的话,其实不就是 belongsTo 默认的写法嘛!

class UserInfo
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
7个月前 评论
讨论数量: 14

当然是:

User hasOne UserInfo
UserInfo belongsTo User

至于为什么不能是 User hasOne UserInfoUserInfo hasOne User,我觉得你应该先了解一下 hasOnebelongsTo 的区别,我猜想你的表结构应该是如下:

user_table
id, xxx

user_info_table
id, user_id, xxx

User hasOne UserInfo 的前提是,UserInfo 表中有一个 User 的外键 user_id,如果两个模型互相都是 hasOne 关系,那你 user 表中也需要写一个 UserInfo 的外键,比如:user_info_id

hasOne 与 belongsTo 是从属关系,至于谁从属谁,就看谁的表中有另一个表的外键,比如 user_id

如果 UserInfo 非要 hasOne User,并且 User 中又没有 UserInfo 的外键,就会报错,比如:

column “user_info_id” not found in user_table

这个是遵循 Laravel ORM 自动匹配模型外键的规则,模型名称+ID。

当然如果你非要用 hasOne,又不想创建 user_info_id 外键在 User 模型中,就需要手动指定外键,那这样就和 belongsTo 没区别了

class UserInfo
{
    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
}

也可以这样来定义 hasOne 模型关系,但你看这样写的话,其实不就是 belongsTo 默认的写法嘛!

class UserInfo
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
7个月前 评论

跟隨語義

7个月前 评论
勇敢的心 (楼主) 7个月前

我的理解是概念上的区别,一个是拥有,一个是属于,但是使用起来没什么区别,唯一的区别就是 belongsTo 可以带上 withDefault() 当数据为空的时候返回的是空数组

7个月前 评论
勇敢的心 (楼主) 7个月前
Mutoulee

1、按文档来说,一对一关系使用hasOne和反向关联belongsTo,文档说的应该就是相对规范的吧,具体参照:模型关联《Laravel 10 中文文档》

2、一对一关联,不管从规范性和习惯性,我都会带上自增主键。

7个月前 评论
勇敢的心 (楼主) 7个月前
Mutoulee (作者) 7个月前
slowlyo

user_info 中 存 user_id

user_info 表仍然需要自己的主键

  • User 模型中关联 UserInfohasOne (一对一关联)
  • UserInfo 模型中关联 UserbelongsTo (一对一反向关联)
7个月前 评论
  1. 问题1 h和h这是不正确的,表的关系是从属关系,h 和 b 这是从属关系,也就是a表里面有一个b表的实例,b表有一个实例属于a表
  2. 问题 2 用id ,灵活,后期扩展和别的表建立关联更方便,通用,缺点,额外的存储【忽略不计】 不用id 那你确定这个表以后不会扩展,不会变化,业务就在这个地方停止【你自己信吗】
7个月前 评论

问题1:目前都是直接使用的hasOne :joy:

问题2:表柑橘最好还是建立一个自增主键比较好,方便维护

7个月前 评论

当然是:

User hasOne UserInfo
UserInfo belongsTo User

至于为什么不能是 User hasOne UserInfoUserInfo hasOne User,我觉得你应该先了解一下 hasOnebelongsTo 的区别,我猜想你的表结构应该是如下:

user_table
id, xxx

user_info_table
id, user_id, xxx

User hasOne UserInfo 的前提是,UserInfo 表中有一个 User 的外键 user_id,如果两个模型互相都是 hasOne 关系,那你 user 表中也需要写一个 UserInfo 的外键,比如:user_info_id

hasOne 与 belongsTo 是从属关系,至于谁从属谁,就看谁的表中有另一个表的外键,比如 user_id

如果 UserInfo 非要 hasOne User,并且 User 中又没有 UserInfo 的外键,就会报错,比如:

column “user_info_id” not found in user_table

这个是遵循 Laravel ORM 自动匹配模型外键的规则,模型名称+ID。

当然如果你非要用 hasOne,又不想创建 user_info_id 外键在 User 模型中,就需要手动指定外键,那这样就和 belongsTo 没区别了

class UserInfo
{
    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
}

也可以这样来定义 hasOne 模型关系,但你看这样写的话,其实不就是 belongsTo 默认的写法嘛!

class UserInfo
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
7个月前 评论

问题1:肯定是hasOne+belongsTo 问题2:加主键,因为你不加mysql底层也会加一个隐式主键

7个月前 评论

简单的问题不要想的太复杂。

7个月前 评论
yyy123456 7个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!