with一对多关联查询限制查询条数

订单表 备注表
他们是一对多的关系,
我想每页读取10个订单,然后获取10个最新的备注
with无法使用limit来控制输出的条数,我想问下就是有没有啥更好的办法来

->with([
                'remarks' => function ($query) {
                    $query->orderByDesc('time')->select(['order_id', 'user_name', 'content', 'time']);
                }
            ])
->paginate(10);
$items = $page->items();
$data = [];
foreach ($items as $value) {
    $remarks = $value->remarks->take(10)->toArray();
    unset($value['remarks']);
    $value['remarks'] = $remarks;
    $data[] = $value;
}
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 25

为啥不可以 真奇怪
with 无法使用 limit 来控制输出的条数

Laravel

6个月前 评论
中文 (楼主) 6个月前
周小云 (作者) 6个月前
周小云 (作者) 6个月前
Rache1 6个月前
ononl 6个月前
中文 (楼主) 6个月前

with可以使用limit来控制的。为什么说不可以呢?还有订单备注还能有多条的场景吗。

6个月前 评论

在model的关联关系那里直接写limit

public function remarks(): \Illuminate\Database\Eloquent\Relations\HasMany
{
    return $this->hasMany(Remark::class, 'order_id', 'id')->limit(10);
}
6个月前 评论
神的孩子丶都在跳舞 (作者) 6个月前
神的孩子丶都在跳舞 (作者) 6个月前
中文 (楼主) 6个月前
神的孩子丶都在跳舞 (作者) 6个月前
中文 (楼主) 6个月前

file

原理楼上已经说的差不多了

Laravel

此处增加limit将会导致数据缺失

6个月前 评论
Complicated

那就自己写吧,先查出来再循环每一条查询就是的。你这个是分页的,循环里写sql应该也没事吧

6个月前 评论

用DB可以实现,默认的情况下模型方式是不支持的。

6个月前 评论

先把 10 个订单对应的备注表数据 group by 一下最大的 id 出来,再 in 一下就可以了

6个月前 评论

主表裡面可以加一個最新備註id

6个月前 评论
cccdz (作者) 6个月前
中文 (楼主) 6个月前
cccdz (作者) 6个月前

获取主表数据id,然后手动拼接了个union查询,我以前是这么实现的 :joy:

6个月前 评论

whereIn (备注的sql语句)

5个月前 评论

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