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中完成)。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

已解决; 今天再次尝试了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年前 评论

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