#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 * fromworkspaces
inner joinform_workspace
onworkspaces
.id
=form_workspace
.workspace_id
whereforms
.id
=form_workspace
.form_id
иid
в (1)) и.forms
deleted_at
равно нулю)2. Это может сработать, хотя : … $query-> где(‘workspaces.id ‘, $workspaces); …
3. Я немного отредактировал его (это должен быть table.column) и проверил его как правильный ответ. Спасибо.
4. На самом деле, я использовал имя столбца в сводной таблице, которое должно работать все равно без дополнительного поиска!
5. Ага. Этого не видел. Я тоже попробую это сделать. В любом случае… Большое спасибо, что нашли время ответить.