
代码解释:
注意事项:
结果格式:
上述代码返回的 JSON 数据格式如下:
[
{
"id": 28,
"status": 1,
"address": "Fish Street",
"user_name": "Artyom",
"user_surname": "Pyotrovich",
"phone": "351 351 643 52",
"email": "email@protected",
"total": 35.8,
"created_at": "2021-11-17T10:44:58.000000Z",
"updated_at": "2021-11-17T10:44:58.000000Z",
"dishes": [
{
"id": 22,
"name": "Pizza",
"restaurant_id": 1,
"pivot": {
"order_id": 28,
"dish_id": 22,
"quantity": 3
}
},
{
"id": 23,
"name": "Burger",
"restaurant_id": 1,
"pivot": {
"order_id": 28,
"dish_id": 23,
"quantity": 1
}
}
]
}
]可以看到,每个订单都包含了 dishes 数组,其中包含了该订单的所有菜品信息,以及中间表 dish_order 中的 quantity 字段。
进一步优化(可选):
如果需要完全符合题目中要求的JSON格式,即 dishes 数组只包含 dish_id 和 quantity 字段,可以在 Eloquent 模型中定义访问器 (Accessor)。
例如,在 Order 模型中可以添加以下方法:
public function getDishesAttribute()
{
return $this->dishes()->select('dishes.id as dish_id', 'dish_order.quantity')->get()->toArray();
}然后在查询时,只需要使用 $orders = Order::with('dishes')->...->get();,Laravel 会自动调用 getDishesAttribute 方法,并返回格式化后的 dishes 数组。 请注意: 这种方法会执行额外的查询,因此需要在性能和代码可读性之间进行权衡。 更好的方法是使用 transform 集合方法在查询后格式化数据,避免额外的数据库查询。
总结:
通过使用 Eloquent 的 with 和 whereHas 方法,我们可以高效地查询并分组关联数据,避免了手动循环遍历的复杂性。 这种方法不仅代码更简洁,而且性能更高。 在实际开发中,应根据具体需求选择最合适的方案。
此外,请注意区分用户 ID 和餐厅 ID,避免潜在的逻辑错误,尤其是在用户可以管理多个餐厅的情况下。
以上就是通过 Eloquent 关联模型分组订单及其菜品信息的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号