laravel ORM关于如何在with语句中将第一个查询结果(一对多关系表)字段赋值给集合

在写orm的时候遇到这样一个问题;
model的关系为:
List为清单表,User为用户表,Product为产品表(包含图片字段:pic);
List : belongsTo->User;
Product : belongsTo->User;

当我查询List时,想预加载user表的信息,
同时还想通过addSelect将Product里面的该user的第一个pic字段地址不为空的查询出来赋值到集合的photo中

List::with(['user'=>function($query){
    $query->select('id','user_id')
        ->addSelect([
            'photo'=>Product::whereColumn('user_id','users.id')
            ->whereNotNull('pic')
            ->select('pic')
            //->first()//尝试后,报错
            //->limit(1)//尝试后,无效
            //->take(1)//尝试后,无效
        ])->withCasts(['photo'=>'varchar'])
}])->get();

但是user跟product是一对多,会查询出很多product;
我现在只需要展示第一张product里面的pic;
所以想尝试了first()、limit(1)、take(1)做限制;
但是查询出来的都不是预期的结果;
想问下通过什么方法可以实现?(通过先查询再foreach已经拿到photo,但还是想通过在一句sql中完成)。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

已解决; 今天再次尝试了take(1)发现可以取到数据; :see_no_evil:

3年前 评论
讨论数量: 7

我直接用返回资源方式处理解决的

3年前 评论

我觉得你可以再加一个一对一的关联在模型里面,虽然不怎么符合逻辑

3年前 评论
Code_Er

user 里面with Product 把所有数据拿出来后再处理不行吗?

3年前 评论

有的时候sql写的简单一点,有序的处理未尝不是一种明智的选择。一条复杂的sql会影响执行效率……

3年前 评论

@Code_Er 实际模型比这复杂 :sob:; product的表里加了索引,目前已经存了将近90万条数据; 想找到更加健壮、高效的写法

3年前 评论

已解决; 今天再次尝试了take(1)发现可以取到数据; :see_no_evil:

3年前 评论
Code_Er

@KaKa_Tao 你这个用户表关联的商品很多嘛 :joy:

3年前 评论

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