Получить модели, которые имеют отношения в другой коллекции

#laravel #eloquent

#laravel #красноречивый

Вопрос:

У меня есть две модели с отношением «многие ко многим». ФОРМА и РАБОЧЕЕ ПРОСТРАНСТВО. Таким образом, ФОРМА принадлежит множеству РАБОЧИХ ОБЛАСТЕЙ, а РАБОЧЕЕ ПРОСТРАНСТВО принадлежит множеству ФОРМ.

Теперь мне нужно выполнить запрос, в котором я получаю все формы, которые принадлежат любому из рабочих пространств в коллекции ($workspaces). Что-то вроде этого:

 $forms = Form::whereHas('workspaces', function ($q) use ($workspaces) {
                $q->whereIn('id', $workspaces);
            })->get();
  

Я знаю, что этот запрос не работает. Но я надеюсь, что это объясняет, что мне нужно сделать. Мне в основном нужно получить все формы, в которых есть РАБОЧЕЕ ПРОСТРАНСТВО, присутствующее в коллекции $ workspaces.

Есть идеи о том, как сделать это чисто и красиво?

Комментарии:

1.Это будет работать, если $q->whereIn('id', [1,2,3]); $workspaces содержит индексированный массив? Нужно знать, что она содержит

Ответ №1:

Предполагая, что вы правильно настроили отношения, вы должны быть в состоянии достичь этого с помощью чего-то вроде:

 $workspaceIds = $workspaces->pluck('id');

$forms = Form::whereHas('workspaces', function ($query) use ($workspaceIds) {
    $query->whereIn('workspace.id', $workspaceIds);
})->get();
  

Комментарии:

1. Отношения настроены правильно (насколько я могу судить). Я могу получить модели форм из рабочей области и наоборот, через отношения. Я уже пробовал предложенный вами способ, и я получаю следующее: SQLSTATE[23000]: нарушение ограничения целостности: 1052 столбца ‘id’ в предложении where неоднозначно (SQL: select * from forms where существует (select * from workspaces inner join form_workspace on workspaces . id = form_workspace . workspace_id where forms . id = form_workspace . form_id и id в (1)) и. forms deleted_at равно нулю)

2. Это может сработать, хотя : … $query-> где(‘workspaces.id ‘, $workspaces); …

3. Я немного отредактировал его (это должен быть table.column) и проверил его как правильный ответ. Спасибо.

4. На самом деле, я использовал имя столбца в сводной таблице, которое должно работать все равно без дополнительного поиска!

5. Ага. Этого не видел. Я тоже попробую это сделать. В любом случае… Большое спасибо, что нашли время ответить.