Получить все модели, которые имеют определенное отношение
В моем приложении Laravel я создаю функцию фильтра. Вы можете отфильтровать модель A, выбрав, какие отношения она должна иметь с моделью B. модель A имеет отношение "многие ко многим" с моделью B. Так, например, модель A1 имеет отношение к модели B1, B2, B3, модель A2 имеет отношение к B2, B3, а модель A3 имеет отношение к модели B3.
Если вы выберете только B3 в модели фильтра A1, A2 и A3 должны отображаться. При выборе B3 и B2 должны отображаться только A1 и A2.
Есть ли способ, которым я мог бы решить эту проблему и как? Я понятия не имею, ясен ли мой пример, если нет, Пожалуйста, скажите мне.
Я попробовал whereHas
, сделав следующее:
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('id', $facilities);
})->get();
Проблема в том, что если я хочу все тренажерные залы с объектом 1 и объектом 2, то он показывает тренажерные залы только с объектом 1 или объектом 2, но мне нужны модели, которые имеют и то, и другое.
Тренажерный зал-это модель A из моего примера, а объект-модель B. $facilities
- это массив идентификаторов объекта.








Ответы - Получить все модели, которые имеют определенное отношение / Get all models that have a specific relation

12.01.2020 02:12:47
Чтобы иметь предложение " where in "в Laravel метод where ().
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('facilities.id', $facilities);
})->get();
Вышеописанные результаты вернут результаты, соответствующие одному или нескольким id
в массиве. Если вы хотите возвращать только совпадения, содержащие все идентификаторы в массиве, вы можете указать это с помощью 3-го и 4whereHas()
:
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('facilities.id', $facilities);
}, '=', count($facilities)) //<-- This bit
->get();
Вышесказанное предполагает, что в $facilities нет никаких дубликатов id
$facilities
существуют в базе данных.



12.01.2020 02:40:47
Where() принимает значение true, если столбец соответствует одному из массивов. Если вам нужна и логика (Не или логика), используйте нормальную где()
$gyms = Gym::query()
foreach ($facilities as $key => $value) {
$gyms->whereHas('facilities', function (Builder $query) use ($facilities) {
$query->where('facilities.id', $value);
});
}
$gyms = $gyms->get();