Laravel — имеет много сквозных

#php #mysql #laravel

#php #mysql #laravel

Вопрос:

Я пытаюсь написать запрос к БД с помощью опции Laravel 5.3 «Имеет много сквозных»

Мои таблицы БД расположены следующим образом :

http://sqlfiddle.com /#!9/a9c9af

Таблицы :

компании компания_предложения предложения

В моей модели у меня есть следующая настройка :

 public function offers()
    {
        return $this->hasManyThrough(
            'AppOffers', 'AppCompanyOffers',
            'company_offer_id', 'offer_id'
        );
    }
  

Когда я пытаюсь запустить следующую строку кода :

 return $this->whereHas('offers', function($query) use ($offer_id)
        {
            return $query->whereIn('offer_id', $offer_id);
        });
  

Я получаю сообщение об ошибке :

Нарушение ограничения целостности: столбец 1052 ‘offer_id’ в предложении where неоднозначен

Как мне исправить это и установить правильные отношения?

Мне нужно получить заголовок предложения и значок предложения для моего внешнего интерфейса.

Надеюсь, это имеет смысл, и кто-нибудь может мне помочь.

Спасибо

Ответ №1:

«Столбец ‘offer_id’ в предложении where неоднозначен» в основном означает, что SQL-запрос имеет дело с несколькими таблицами и не знает, на какую таблицу offer_id ссылается:

Например, запрос может выполнять что-то вроде

 select offers.* from offers
left join another_table on another_table.field = offers.field
where offer_id = ?
  

Обратите внимание, что offer_id в приведенной выше таблице может ссылаться на столбец в offers или another_table .

Что вы должны сделать, чтобы исправить ошибку, это добавить префикс offer_id к имени таблицы. Что-то вроде этого:

 return $this->whereHas('offers', function($query) use ($offer_id) {
    return $query->whereIn('other_table.offer_id', $offer_id);
});
  

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

1. Благодаря @Jonathon запрос теперь выполняется, но возвращает пустые данные. (Хотя должен быть результат) Надеясь получить вывод SQL, чтобы иметь возможность отлаживать его оттуда.

2. @StuBlackett Вы можете прослушивать события запроса .

3. @StuBlackett Вы также можете использовать комбинацию DB::enableQueryLog() перед выполнением любых запросов и DB::getQueryLog() после, чтобы увидеть, что было выполнено 🙂