Laravel5 ORM: как псевдоним multipleCount на одном и том же связанном объекте

86
6

У меня есть модель отеля, в которой есть много комнат, которые могут быть заняты. Как я могу запросить это:

Список отелей

    количество комнат количество занятых номеров

Запрос:

$hotels = Hotel::where('foo',$bar)
->withCount('rooms')
->withCount(['rooms' => function ($query) {
$query->where('status', 'Occupied');
}])
->get();

Результат:

$hotel->rooms_count дает количество занятых комнат, которое является последним выражением withCount.

То, что я получаю

    $hotel->rooms_count как количество номеров в каждом отеле

    $hotel->occupied_rooms_count как количество занятых номеров каждого отеля

как псевдоним второго с withcount:

Вопрос

Есть ли способ сделать псевдоним второй с помощью withCount on Room?

спросил(а) 2016-09-08T10:14:00+03:00 4 года, 7 месяцев назад
1
Решение
87

Вместо того, чтобы указывать, where предложение в вашем withCount определяет отношение для занятых комнат в Hotel Model.

public function occupied_rooms(){
return $this->hasMany(Room::class)
->where('status', 'Occupied');
}

Теперь в вашем контроллере используйте withCount('occupied_rooms').

$hotels = Hotel::where('foo',$bar)
->withCount(['rooms','occupied_rooms'])
->get();

ответил(а) 2016-09-08T14:27:00+03:00 4 года, 7 месяцев назад
138

Хотя ответ @jaysingkar - хороший способ пойти и ответить на вопрос довольно хорошо, да, возможно, чтобы псевдоним withCount() хотя это еще не задокументировано :

$hotels = Hotel::where('foo', $bar)
->withCount([
'rooms',
'rooms AS occupied_rooms' => function ($query) {
$query->where('status', 'Occupied');
}
])
->get();

Это даст вам $hotel->occupied_rooms_count с количеством занятых номеров каждого отеля. :)

Код, в котором происходит эта магия, можно увидеть здесь. Он был добавлен в Laravel 5.3.7 через PR # 15279.

Обновлено: я представил PR, и теперь он правильно документирован. :)

ответил(а) 2017-03-13T13:12:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема