Laravel:关于with用法 OneByOne 关联(避坑)

本文介绍了在Laravel中使用`with`进行关联查询时可能遇到的坑,包括如何正确地获取关联表数据以及指定字段的重要性。通过示例详细解释了如何避免返回null的情况,确保关联数据的正确获取。

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

with

Laravel 提供当两个表有关联关系时,在Model层建立关系后,在使用过程总,用 with 把关联关系的数据获取出来。

避坑1:假如我使用了关联表 activity 的数据。

Complaint::filter($params)
                 ->with(['activity' => function($query) {
                     return $query->select(['title']);
                 }])
                 ->select(['id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
                 ->get();

结果:没有获取到 关联数据 activity,返回null。
原因:指定select方法字段没有包含作为外键的关联with,意思是你要拉取 activity 相关数据,同时需要把 activity_id 字段获取出来,否则就不要指定字段。

避坑2:假如我加上了,外键 activity_id 字段

Complaint::filter($params)
                 ->with(['activity' => function($query) {
                     return $query->select(['title']);
                 }])
                 ->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
                 ->get();

结果:仍然返回null,你关联上了,怎么还返回null,假如你关联了数据也指定了获取字段。
原因:关联数据指定字段的话,需要把关联数据中的主键id也要加上。

用法1:我现在都加上了

Complaint::filter($params)
                 ->with(['activity' => function($query) {
                     return $query->select(['id', 'title']);
                 }])
                 ->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
                 ->get();
  • with: activity 指定字段,加上主键后,再加上其他需求字段。
  • 主SQL:select 指定字段,加上activity_id
  • bingo:获取成功,拉取到activity 相关联数据,且activity 获取指定的字段。

用法2:正常用法,不指定字段

Complaint::filter($params)
                 ->with(['activity', 'xxx', 'yyy'])
                 ->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
                 ->get();
  • with 使用一维数组时,可以指定多个关联,去掉数组时,允许指定单个关联。
  • with 使用关联数组时,以 key 为关联头,以value为关联体。
//无欲无求式,指定查询字段
->with(
['activity' => function($query) {
	//你可以在这里使用你要对关联体的查询
                     return $query->select(['id', 'title']);
                 }]
//这么搞,指定参数
->with(
['activity' => function($query) use ($params){
	//也可以指定查询参数,作为关联体的查询
                     return $query->select(['id', 'title']);
                 }]

//多搞
->with(
[
	'activity' => function($query) use ($params){
	//也可以指定查询参数,作为关联体的查询
                     return $query->select(['id', 'title']);
                 },
	'user' => function($query) use ($params){
                     return $query->select(['id', 'user_name']);
                 }
]

遇到使用 with 的坑,就是在这里。
由于目前还没有看源码是如何实现的,只能讲到使用到哪里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值