Столбец Laravel Nova в предложении where неоднозначен / неизвестен в предложении where

#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 .

Снимок экрана 2019-04-12 в 13 47 09

Если я вместо этого использую return $query->whereIn('time_slot_id',$time_slot_ids); запрос, он работает с событием и правильно возвращает вложенные временные интервалы. Однако это, в свою очередь, приводит к сообщению об ошибке на странице временных интервалов, которая гласит SQLSTATE[42S22]: Column not found: 1054 Unknown column 'time_slot_id' in 'where clause' .

Снимок экрана 2019-04-12 в 13 47 49

Мой полный блок кода;

 /**
     * 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.

Пользователь принадлежит к пользовательскому уровню. Пользователь принадлежит к группе. Пользователь принадлежит ко многим событиям. Пользователь принадлежит многим временным интервалам.

На уровне пользователя много пользователей.

В группе много пользователей. В группе много событий.

Событие принадлежит группе. Событие принадлежит многим пользователям. Событие принадлежит многим временным интервалам.

Временной интервал принадлежит многим событиям. Временной интервал принадлежит многим пользователям.

Попытка создать индексный запрос, в котором возвращаются только временные интервалы, связанные с событиями группы аутентифицированного пользователя.

Я делаю что-то не так?

Вот полный список запросов, выполненных до того, как я получу первую ошибку;

Запросы Laravel 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);