手机行业|3分钟短文:Laravel 模型一对一关联关系这俩啥区别

引言
本期我们把目光投向laravel模型的关联关系上 。 框架提供的关联关系 , 有很多种 , 其中对于一对一的关系 ,有两个写法 , 一个是 belongsTo , 一个是 hasOne , 这俩到底啥区别 , 本文就来说一说 。
学习时间
从文档上讲 , belongsTo 是 hasOne 的逆函数 。 拿User表作为示例 , 比如一个用户 , 只有一个手机号 ,首先使用 hasOne 方式定义关联:
【手机行业|3分钟短文:Laravel 模型一对一关联关系这俩啥区别】class User extends Model
{ /**
* 获取与user对应的phone记录
*/
public function phone()
{
return $this->hasOne('App\\Phone');
使用上述的 hasOne 方法 , 可以使用 $user->phone 返回一个 Phone 模型对象 , 但是反过来不行 ,你不能通过 Phone 获取 User , 也就是 $phone->user , 这是做不到的 。
要达到这个目的 , 你需要在 Phone 模型中 , 相应地定义 Phone 到 User 的对应关系 , 如下:
class Phone extends Model
{ /**
* 通过 phone 查找对应 user
*/
public function user()
{
return $this->belongsTo('App\\User');
虽然这样写了 , 大家也许还看的迷迷糊糊 。 因为关联关系的第二个 , 第三个参数 , 根本没有填写 。所以这样对比是不直观的 。
hasOne 和 belongsTo 最大的不同 , 是哪一方持有关系的外键 。
举个例子 , 比如User表 , 还有一个 Car表 , 为了简化逻辑关系 ,我们假设一个user只有一个car 。 我们在car表内设计一个 user_id 字段 , 用于存储 user 表的 id 值 。那么模型设计起来就应该是这样的:
class User extends Model
{
public function car()
{ // $user->car 返回一个 Car 模型对象
return $this->hasOne('Car');
然后就是 Car 到 User 的反关系 , 外键为 user_id , 定义关联关系:
class Car extends Model
{
public function user()
{ // car 表有一个 user_id 字段
return $this->belongsTo('User' 'user_id' 'id');
再说一个一对多的关系示例 , 比如说一个用户有多个手机号 , 那么使用 hasMany 关联模型:
class User extends Model
{
public function phones()
{ // $user->phones 会返回一个 Phone 模型的集合
return $this->hasMany('Phone');
那么反过来 , 我们在 phone 表内使用 user_id 存储用户的id , 定义反向关系 , 这样写:
class Phone extends Model
{
public function owner()
{
return $this->belongsTo('User' 'user_id' 'id');
所以 , 反向关系无关于原始的一对一 , 或者一对多 , 因为数据库表内存储了外键 , 所以使用这个belongsTo对应回去 。
写在最后
本文通过几个实例介绍了数据库模型的一对一 , 一对多 , 以及反向关联关系 ,大家记住一点 , belongsTo 是根据当前表存储的外键 , 去主表内查找记录 , 而且是返回一个模型对象 , 或者null 。至于 hasOne hasMany 则是定义的主表的关系 。大家多多练习体会一下 。
Happy coding :-)
我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。
推荐阅读
- 3分钟就能做好的营养早餐,味道鲜美口感好,小孩爱吃极了!
- 地球|“小恒星今晚靠近地球,务必关闭手机”是老谣言又还魂了
- 鸡蛋这样做太香了,不用蒸不用煎,早餐端上桌,3分钟就光盘,香
- 早餐迷上吃饼,不揉面不擀面,3分钟出锅,比包子油条好吃多了
- 柑橘|沃柑有农残果农从来不吃?广西柑橘类种植行业协会回应
- 最下饭的快手菜! 3分钟就能出锅, 连吃3大碗饭都嫌少!
- 曲向阳|曲向阳:非洲猪瘟弱毒株出现令防控难度加大,行业将进入3-5年持续盈利期
- 花卷不要再蒸着吃了,试试着样做,3分钟就出锅,宣软又酥脆!
- 社交|“电话焦虑”:为什么那么多人害怕听到手机铃声?
- 比烧烤还好吃孜然鱿鱼须,香辣可口,3分钟学会,吃上就停不下来
