Я думаю, это то, что вы ищете
Существует метод withCount()
, который делает ->select('lamp_id', 'order_id', 'room', DB::raw('count(*) as total'))
работу для вас
https://laravel.com/docs/5.8/eloquent-relationships#counting -по-родственные модели
Обратите внимание, что поскольку свойство ->lamps
на самом деле является отношением, мы не можем изменить его, поэтому мы делаем его скрытым и создаем новое свойство с именем grouped_lamps
public function index()
{
$orders = Order::withCount('lamps')
->with('lamps.image')
->get()->map(static function (Order $order) {
$order->lamps->each(static function (Lamp $lamp) {
$lamp->room = $lamp['pivot']['room'];
});
return $order;
})->each(function (Order $order) {
$order->grouped_lamps = $order->lamps->groupBy(['room', 'id']);
$order->makeHidden('lamps');
return $order;
});
return response()->json([
'orders' => $orders,
], 200);
}
Редактировать
Я не уверен, что это то, что вы ищете, но здесь мы go
Сначала нам нужно получить этот дополнительный столбец room
с нашим отношением, поэтому убедитесь, что в вашем Order
модель, которую вы добавляете ->withPivot('room')
вот так
public function lamps()
{
return $this->belongsToMany(Lamp::class, 'lamp_order', 'lamp_id', 'order_id')
->withPivot('room');
}
И вот код, нам больше не нужно иметь grouped_lamps
public function index()
{
$orders = Order::withCount('lamps')
->with('lamps.image')
->get()->map(function (Order $order) {
$order->lamps->each(static function (Lamp $lamp) use ($order) {
$lamp->room = $lamp['pivot']['room'];
$lamp->count = $order->lamps_count;
});
return $order;
});
return response()->json([
'orders' => $orders,
], 200);
}
Надеюсь, это поможет
Окончательное редактирование
Хорошо, просмотрев мой код, я обнаружил, что допустил честную ошибку
Соотношение ламп foreign_key
и local_key
Неправильное размещение. Это правильная форма
public function lamps()
{
return $this->belongsToMany(Lamp::class, 'lamp_order', 'order_id', 'lamp_id')
->withPivot('room');
}
А вот и новая версия кода
Обратите внимание, что если вы в порядке с предыдущим форматом, вам не нужно использовать ниже код
public function index()
{
$orders = Order::withCount('lamps')
->with('lamps.image')
->get()
->map(static function (Order $order) {
$order->lamps->each(static function (Lamp $lamp) {
$lamp->room = $lamp['pivot']['room'];
});
return $order;
})->each(function (Order $order) {
$groupedLamps = $order->lamps->groupBy('room');
$order->lamps->each(function (Lamp $lamp) use ($groupedLamps) {
$lamp->count = $groupedLamps[$lamp->room]->count();
});
});
return response()->json([
'orders' => $orders,
], 200);
}
И вы получите такой результат
{
"orders": [
{
"id": 1,
"title": "ut fugit facilis",
"lamps_count": 5, // Total lamps owned by this order
"lamps": [
{
"title": "ab sunt nostrum",
"room": "kitchen",
"count": 3, // Total number of kitchen lamps of order_id 1
"pivot": {
"order_id": 1,
"lamp_id": 1,
"room": "kitchen"
}
},
{
"title": "omnis dicta rerum",
"room": "hall",
"count": 2, // Total number of hall lamps of order_id 1
"pivot": {
"order_id": 1,
"lamp_id": 2,
"room": "hall"
}
},
{
"title": "eligendi deserunt et",
"room": "hall",
"count": 2, // Total number of hall lamps of order_id 1
"pivot": {
"order_id": 1,
"lamp_id": 3,
"room": "hall"
}
},
{
"title": "modi ad ea",
"room": "kitchen",
"count": 3, // Total number of kitchen lamps of order_id 1
"pivot": {
"order_id": 1,
"lamp_id": 4,
"room": "kitchen"
}
},
{
"title": "eos neque consequatur",
"room": "kitchen",
"count": 3, // Total number of kitchen lamps of order_id 1
"pivot": {
"order_id": 1,
"lamp_id": 5,
"room": "kitchen"
}
}
]
},
{
"id": 2,
"title": "sapiente velit quas",
"lamps_count": 2,
"lamps": [
{
"title": "eligendi deserunt et",
"room": "kitchen",
"count": 2,
"pivot": {
"order_id": 2,
"lamp_id": 3,
"room": "kitchen"
}
},
{
"title": "modi ad ea",
"room": "kitchen",
"count": 2,
"pivot": {
"order_id": 2,
"lamp_id": 4,
"room": "kitchen"
}
}
]
},
{
"id": 3,
"title": "itaque sint voluptas",
"lamps_count": 4,
"lamps": [
{
"title": "omnis dicta rerum",
"room": "kitchen",
"count": 1,
"pivot": {
"order_id": 3,
"lamp_id": 2,
"room": "kitchen"
}
},
{
"title": "eligendi deserunt et",
"room": "living_room",
"count": 1,
"pivot": {
"order_id": 3,
"lamp_id": 3,
"room": "living_room"
}
},
{
"title": "modi ad ea",
"room": "hall",
"count": 2,
"pivot": {
"order_id": 3,
"lamp_id": 4,
"room": "hall"
}
},
{
"title": "eos neque consequatur",
"room": "hall",
"count": 2,
"pivot": {
"order_id": 3,
"lamp_id": 5,
"room": "hall"
}
}
]
}
]
}