laravel5.4模型关联查询的坑

本文详细介绍了在Laravel框架中如何正确处理模型之间的关联,并重点讲解了一对一关联中字段选择的技巧。通过具体实例,展示了如何避免查询时返回不需要的字段,以及在with方法中使用闭包进行字段限定的正确方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为工作原因再次使用laravel,自然也是要写模型关联的代码,比如有自带的用户表users和用户信息表usersinfo

id,userid,address

模型名

UsersInfo.php

很简单的一对一关联

user模型内的定义

public function HasUsersInfo(){

return $this->hasOne('App\UsersInfo','userid');

}

随便插了几条数据(这里不展示其它数据,因为没意义)

用户表

idname
1gcud
2gcud2
3gcud3

用户信息表

idaddressuserid
1地址11
2地址22
3地址33

然后假设我想查询id>1的用户名和地址

 $Users=User::where('id','>',1)->with('HasUserInfo')
        ->get();
        dd($Users);

结果

array:2 [▼
  0 => array:6 [▼
    "id" => 2
    "name" => "gcud2"
    "email" => "gcud2@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 2
      "address" => "地址2"
      "userid" => 2
    ]
  ]
  1 => array:6 [▼
    "id" => 3
    "name" => "gcud3"
    "email" => "gcud3@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 3
      "address" => "地址3"
      "userid" => 3
    ]
  ]
]

虽然能得到结果,但列出所有字段的结果并不是我想要的,于是如同往常的,我在get里限定了列

$Users=User::where('id','>',1)->with('HasUserInfo')
        ->get(['name']);
        dd($Users->toArray());

结果

array:2 [▼
  0 => array:2 [▼
    "name" => "gcud2"
    "has_user_info" => null
  ]
  1 => array:2 [▼
    "name" => "gcud3"
    "has_user_info" => null
  ]
]

确实是只剩下名字,但地址也跟着空了,经谷歌搜索和5.4文档上写的,好像是要在with关联里面写闭包,指定字段,大概是这个样子

        $Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('address');
        }])
        ->get(['name']);
        dd($Users->toArray());

然而结果仍然为空,不知是我眼拙还是什么,我反正是没在5.4文档找到模型关联查询指定字段的方法,谷歌搜来搜去都是在说要用闭包select来指定字段,就是像上面写的那样

当时用谷歌搜索时前几个总是思否的几个问题,在别人的问题的几轮回复提问下我还是找到了答案,那就是闭包内和原模型都要传入关联字段

        $Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('userid','address');
        }])
        ->get(['id','name']);
        dd($Users->toArray());

结果

array:2 [▼
  0 => array:3 [▼
    "id" => 2
    "name" => "gcud2"
    "has_user_info" => array:2 [▼
      "userid" => 2
      "address" => "地址2"
    ]
  ]
  1 => array:3 [▼
    "id" => 3
    "name" => "gcud3"
    "has_user_info" => array:2 [▼
      "userid" => 3
      "address" => "地址3"
    ]
  ]
]

真坑,卡了我很一会儿,写这篇文章时我又去搜了谷歌,发现第一条就是就是需要的,虽然没有明确指明要带关联,看看还能能很快知道的

哦,另外还有一个小坑的地方就是模型名称,从直觉来看,默认情况下模型名是表名加个s,但如果不仔细看文档可能会出问题,文档里面说了

除非数据表明确地指定了其它名称,否则将使用类的「蛇形名称」、复数形式名称来作为数据表的名称。

一般情况下直接加s是没问题的,但别忘了说的是复数形式,在英文中某些特殊字母结尾的单词并不是直接加s,比如study的复数形式是studies,也就是说模型名为Study.php,默认表名得是studies,我也不想去研究英文的复数规则,直接模型里指定表名就是了

转载于:https://my.oschina.net/u/3470006/blog/3020215

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值