在 Laravel 中使用分页时过滤多对多关系中的数据

问题描述 投票:0回答:1

在我的 Laravel 应用程序中,我有多对多关系的

order
status
模型。我想根据数据透视表 order_status 表中设置的最新状态获取订单。我还想根据最新状态过滤数据。 这是我的状态表:

id 文字 颜色 创建于 更新于
1 草稿 2024-01-22 00:28:09 2024-01-22 00:28:09
2 已批准 #492E87 2024-01-22 00:28:09 2024-01-22 00:28:09
3 生产 #FFD700 2024-01-22 00:28:09 2024-01-22 00:28:09
4 质量保证 #FFA500 2024-01-22 00:28:09 2024-01-22 00:28:09
5 准备好 #2196F3 2024-01-22 00:28:09 2024-01-22 00:28:09

这是我的订单表:

id:订单id 客户可订购 ID 来电 可订购型 商家参考 创建者 发货渠道 交货日期 金额
5 ET-ORD-1002 5 应用程序模型商家 36 3 2823-09-20
6 ET-ORD-1003 商城 4 应用程序模型商家 36 3 2758
7 ET-ORD-1004 4 应用程序模型商家 36 3 4888
8 ET-ORD-1005 7 应用程序模型商家 1 30 9 1350
10 ET-ORD-1007 坚果 7 应用程序\模型\商家 44 3 2050
11 ET-ORD-1008 8 应用程序\模型\商家 1 44 9 1720

这是我的 order_status 表:

状态_id 订单_id 评论 创建于 更新于
3 3 11 2024-01-21 23:46:39 2024-01-21 23:46:39
7 3 12 2024-01-21 23:46:39 2024-01-21 23:46:39
8 3 13 2024-01-21 23:46:39 2024-01-21 23:46:39
9 2 18 2024-01-21 23:46:39 2024-01-21 23:46:39
10 2 19 2024-01-21 23:46:39 2024-01-21 23:46:39
11 2 20 2024-01-21 23:46:39 2024-01-21 23:46:39
12 2 21 2024-01-21 23:46:39 2024-01-21 23:46:39

我想从

created_at
表中获取基于
order_status
的最新状态的订单,并且还想获取具有最新状态的订单,其中状态 id 可以说是 [1,2]

这是我的订单模型关系:

public function latestStatuses()
    {
        return $this->belongsToMany(Status::class)
            ->orderByPivot('created_at', 'desc')->limit(1);
    }

我已尝试此查询来获取最新状态。但过滤器不适用于分页。

$query = Order::with(['latestStatuses'])->latest('id');
$orders = $query->paginate($pageSize);
laravel eloquent
1个回答
0
投票

这确实是一个非常普遍的场景。我总是联系 subquery selects 来解决这个问题。

Order::addSelect([
    'latest_status_id' => DB::table('order_status')
        ->select('status_id')->whereColumn('order_status.order_id', 'order.id')
        ->orderBy('order_status.created_at')
        ->limit(1)
    ])
    ->paginate($pageSize);

如果您想通过

latest_status_id
字段过滤上述结果,您可能需要使用
having
而不是
where

Order::addSelect([
    'latest_status_id' => DB::table('order_status')
        ->select('status_id')->whereColumn('order_status.order_id', 'order.id')
        ->orderBy('order_status.created_at')
        ->limit(1)
    ])
    ->having('latest_status_id', $someStatusId)
    ->paginate($pageSize);
© www.soinside.com 2019 - 2024. All rights reserved.