在 with 查询中只查询个别字段

最近在项目开发中,调用 with 方法预加载数据,默认会把所有字段都查询出来,但是我只想查询个别字段。
百度了一下,网上列举了很多方法。试了一下,发现一个问题,如果我 select 的时候没有 id 的话就会为 null

public function brand()
 {
        return $this->belongsTo(Brand::class, 'brandId')->select('briefCode');
 }

file
如果 select 的时候有 id 的话就没有问题

public function brand()
 {
        return $this->belongsTo(Brand::class, 'brandId')->select('id', 'briefCode');
 }

file

网上都没有说一定要传 id,:joy: :joy: :joy:

另外又发现一个问题:

在为预加载添加约束条件的时候,如果在闭包中指定 select 字段,最后关联也会为 null

$parts = ShippingOrderPart::where('id', 602)
            ->with(['shippingOrder' => function ($query) {
                $query->select('id', 'carrier');
            }])
            ->get();

file
执行的 sql 语句如下:

select * from `shipping_order_parts`  where `id` = 602
select `id`, `carrier` from `shipping_order` where `shipping_order`.`id` in ('1544')

当我不指定 select 字段,结果正常。
file
执行的 sql 语句如下:

select * from `shipping_order_parts` where `id` = '602'
select * from `shipping_order` where `shipping_order`.`id` in ('1544')
本作品采用《CC 协议》,转载必须注明作者和本文链接

为了点个赞,专门注册的账号

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 11

可以预加载的时候限定。

$model->with(['brand:briefCode'])->select();
1年前 评论

因为关联关系有用到id字段,肯定就需要查询出来,不然ORM无法关联整理成对应的数据结构。不过有更好的方法,不要约束在这个里面,如:

$result = Brand::with(['brand' =>  function($query){
    $query->select('id', 'briefCode');
}])->get();
1年前 评论
王成涛

@doobi laravel 版本是 5.4, 不支持 :joy:

1年前 评论
王成涛

@sunny-kevin 是的,不过用查询作用域更好一些

1年前 评论

@王成涛 这个就看你实际应用了,主要看模型的关联关系,比如关联模型比较多,分别要查询的字段不一样,用with会比较好,更加动态化。

1年前 评论
HACK_QC

前几天刚好也碰到这个问题要查询id才能查出数据

1年前 评论
王成涛

@sunny-kevin 文章更新,末尾添加了一点内容。在预加载的时候使用 select 指定字段,关联结果为 null,目前还未找到原因。 :monkey_face:

1年前 评论

@王成涛 一般来说应该是select没有查出关联的字段,比如id,具体需要看下你的关联关系和你的代码才能详细给你解答

1年前 评论
王成涛

@sunny-kevin 非常感谢,原因就是按您说的,select没有查出关联的字段。thanks

1年前 评论

你说错了不是id的问题 是你关联外键的问题,关联的外键是什么,查询的字段的时候必须要带上

9个月前 评论
王成涛

@sbkk 是的 :+1:

9个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!