Получить все модели, которые имеют определенное отношение

Получить все модели, которые имеют определенное отношение

12.01.2020 01:45:28 Просмотров 35 Источник

В моем приложении 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- это массив идентификаторов объекта.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation#comment105559149_59703003
Это ответ на ваш вопрос? Laravel-запрос фильтра
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation#comment105559253_59703003
Я обновил свой вопрос с whereHas, но это не дает никаких результатов.
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation#comment105559281_59703003
@Rwd в этом случае отношение не много-ко-многим.
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation#comment105559325_59703003
@Rwd да, это так.

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

Rwd

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существуют в базе данных.

https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation/59703209#comment105559322_59703209
упс, моя беда. Но все же это показывают все результаты, которые есть у Объекта 1 или объекта 2. Мне нужны только результаты, которые имеют объект 1 и Объект 2.
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation/59703209#comment105560541_59703209
@BartBergmans я обновил свой ответ, чтобы показать, как вы можете получить только те результаты, которые соответствуют всем идентификаторам в массиве.
Kristian

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();
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation/59703423#comment105559598_59703423
Это не будет работать, как ваша основная поговорка: "Где id = 1 и id = 2 и id = 3 ...".
https://stackoverflow.com/questions/59703003/get-all-models-that-have-a-specific-relation/59703423#comment105559690_59703423
...дайте мне строки, где idравен 1, но и где идентификатор той же строки также равен 2 и 3 .
Закрыть X