在我的 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);
这确实是一个非常普遍的场景。我总是联系 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);