#php #laravel #laravel-nova #laravel-5.8
#php #laravel #laravel-nova #laravel-5.8
Вопрос:
- Версия Laravel: 5.8
- Версия Nova: 2.0.0
- Версия PHP: 7.2.1
- Операционная система и версия: Max OSX 10.13.6
- Тип и версия браузера: Firefox 66.0.3
Описание:
Привет, у меня есть 2 модели, относящиеся к этой ошибке; Событие и временной интервал. Они имеют отношения belongsToMany друг с другом.
Я создал индексный запрос, чтобы извлекались только временные интервалы, связанные с доступными событиями.
Проблема в том, что если я использую return $query->whereIn('id',$time_slot_ids);
, я получаю сообщение о записи события, в котором говорится SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
.
Если я вместо этого использую return $query->whereIn('time_slot_id',$time_slot_ids);
запрос, он работает с событием и правильно возвращает вложенные временные интервалы. Однако это, в свою очередь, приводит к сообщению об ошибке на странице временных интервалов, которая гласит SQLSTATE[42S22]: Column not found: 1054 Unknown column 'time_slot_id' in 'where clause'
.
Мой полный блок кода;
/**
* Build an "index" query for the given resource.
*
* @param LaravelNovaHttpRequestsNovaRequest $request
* @param IlluminateDatabaseEloquentBuilder $query
* @return IlluminateDatabaseEloquentBuilder
*/
public static function indexQuery(NovaRequest $request, $query)
{
if(auth()->user()->userLevel->level == 'Group') {
$time_slot_ids = [];
foreach(auth()->user()->group->events as $event) {
foreach($event->timeSlots as $timeSlot) {
$time_slot_ids[] = $timeSlot->id;
}
}
return $query->whereIn('time_slot_id',$time_slot_ids);
}
}
Шаги для воспроизведения:
Создайте модель пользователя, уровня пользователя, группы, события и временного интервала и сопутствующий ресурс Nova.
Пользователь принадлежит к пользовательскому уровню. Пользователь принадлежит к группе. Пользователь принадлежит ко многим событиям. Пользователь принадлежит многим временным интервалам.
На уровне пользователя много пользователей.
В группе много пользователей. В группе много событий.
Событие принадлежит группе. Событие принадлежит многим пользователям. Событие принадлежит многим временным интервалам.
Временной интервал принадлежит многим событиям. Временной интервал принадлежит многим пользователям.
Попытка создать индексный запрос, в котором возвращаются только временные интервалы, связанные с событиями группы аутентифицированного пользователя.
Я делаю что-то не так?
Вот полный список запросов, выполненных до того, как я получу первую ошибку;
Комментарии:
1. Для этого нам нужно было бы увидеть полную сборку запроса, но для первого вам нужно указать, из какой таблицы поступает идентификатор
and `id` in (...)
, а второй пытается найти time_slot_id в таблицеtime_slots
.2. Я это понимаю. Но для первого, почему Laravel / Laravel Nova автоматически не просматривает таблицу time_slots, когда я создал индексный запрос в TimeSlot.php в каталоге app / Nova?
3. Из-за способа построения запроса. Вы не показываете остальную часть построения запроса, поэтому трудно сказать, но это внутреннее соединение, а не поиск отношений, поэтому вы должны сообщить mysql, к какой таблице принадлежат столбцы.
4. Хорошо, я предоставил полный список запросов для первой ошибки в нижней части моего вопроса. Это помогает? Как вы сообщаете mysql, к какой таблице принадлежит столбец, когда подключаетесь к красноречивому запросу в Laravel? Из Laravel ( laravel.com/docs/5.8/eloquent ): «По соглашению, «случай змеи», множественное число имени класса будет использоваться в качестве имени таблицы, если явно не указано другое имя»
5. Вы должны знать себя, когда используете запросы объединения. Это меньше похоже на Laravel и больше на SQL. При использовании одной таблицы это не проблема. Но когда у вас есть две или более таблиц, и вы запрашиваете столбец, который существует более чем в одной таблице (например, ID), вы должны сообщить MySQL, к какой таблице принадлежит этот столбец
Ответ №1:
При одновременном запросе нескольких таблиц необходимо указать имена таблиц для общих имен столбцов. Поэтому при запросе идентификатора используйте это:
return $query->whereIn('time_slots.id',$time_slot_ids);