Laravel Many to Many Как сформировать запрос в красноречивом или в построителе запросов

Из следующего запроса я получаю ожидаемый результат:

SELECT *
    FROM rooms r
    JOIN amenities_room am 
      ON r.id = am.room_id 
    JOIN amenities a 
      ON am.amenities_id = a.id
     AND a.id IN (2,3)
GROUP BY r.id
  HAVING COUNT(*)=2;

Как я могу выполнить запрос в laravel в (Eloquent или в Query Builder)

Примечание. Используются следующие таблицы:

комнаты
идентификатор
номер
имя

удобства
идентификатор
имя

комната_удобств
идентификатор_комнаты
идентификатор_услуг


person arun    schedule 07.10.2017    source источник
comment
rooms имеет много amenities? удобств`, принадлежащих amenities_room?! Вы должны отредактировать свой вопрос и сообщить нам отношения между моделями. Если это 1:N или N:N. Я предлагаю вам сначала прочитать документацию: laravel.com/docs/5.5/eloquent-relationships   -  person null    schedule 07.10.2017
comment
пожалуйста, примите любой ответ, который решил вашу проблему, чтобы закрыть этот вопрос, и проголосуйте за любой/все ответы, которые помогли решить вашу проблему.   -  person Mr. Pyramid    schedule 26.10.2017


Ответы (2)


$rooms = Room::with('amenities')
->withCount('amenities', function($query){
  $query->whereIn('id', [2, 3]);
})
->where('amenities_count', 2)
->get()

Документы для подсчета связанных моделей: https://laravel.com/docs/5.5/eloquent-relationships#counting-related-models

person Jeff    schedule 07.10.2017
comment
Извините за правки, пришлось провести больше исследований, чем я думал, чтобы получить это. - person Jeff; 07.10.2017
comment
сообщение: mb_strpos() ожидает, что параметр 1 будет строкой, данный объект получает эту ошибку - person arun; 09.10.2017

Вы получили эту ошибку mb_strpos() expects parameter 1 to be string, object given, потому что ваш красноречивый ожидает строку, но вы передали объект здесь в withCount() попробуйте это

$rooms = Room::with('amenities')
->withCount('amenities')->where(function($query){
  $query->whereIn('id', [2, 3]);
})
->where('amenities_count', 2)
->get()
person Mr. Pyramid    schedule 12.10.2017