#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()
после, чтобы увидеть, что было выполнено 🙂