
代码解释:
- Order::with('dishes'): 使用 with 方法预加载 Order 模型关联的 dishes 关系。这避免了 N+1 查询问题,提高了查询效率。
- ->whereHas('dishes', ...): 使用 whereHas 方法对 dishes 关系进行条件过滤。只有包含指定 restaurant_id 的菜品的订单才会被返回。
- $dishes->where('restaurant_id', $restaurantId): 在 whereHas 的闭包中,我们指定了 restaurant_id 作为过滤条件,确保只获取属于特定餐厅的菜品相关的订单。
- ->get(): 执行查询并获取结果集。
- return response()->json($orders): 将查询结果以 JSON 格式返回。 Laravel 会自动将 Eloquent 模型转换为 JSON 格式。
注意事项:
- 确保模型之间的关联关系已正确定义。
- restaurantId 参数应该与餐厅的实际 ID 对应。
- 如果需要更复杂的条件过滤,可以在 whereHas 的闭包中添加更多的 where 子句。
结果格式:
上述代码返回的 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,避免潜在的逻辑错误,尤其是在用户可以管理多个餐厅的情况下。










