У меня есть 3 стола artist
, catalog
& cat_artist
(сводная таблица). При извлечении строки из моей таблицы каталога я хочу, чтобы все связанные с ней художники. Я мог бы просто сделать это с сырым sql, но с помощью laravel он чувствует себя не так, потому что у него есть много функций, чтобы сделать это уже. Таким образом, у меня есть функция в моей модели продукта (модальный продукт ссылается на таблицу каталога), чтобы создать объединениеEloquent BelongsToMany Отношения ищут null
public function artists()
{
return $this->belongsToMany('App\Artist', 'cat_artist', 'LOOK_UP_TO_CAT_ID', 'LOOK_UP_TO_ARTIST_ID');
}
тогда я называю это прежде, чем я возвращаю мой взгляд, который дает мне строку из моей таблицы каталога
$product = Product::find($id);
Теперь я хочу, чтобы все художники, которые могут принадлежать к этому продукту как хорошо, так что я называю следующее
$artists = $product->artists()->get();
Это возвращает результирующий набор пуста
Вот запрос журнала из приведенного выше
array(2) {
[0]=> array(3) {
["query"]=> string(60) "select * from `catelogue` where `catelogue`.`id` = ? limit 1"
["bindings"]=> array(1) {
[0]=> int(96033)
}
["time"]=> float(0.91)
}
[1]=> array(3) {
["query"]=> string(289) "select `artist`.*, `cat_artist`.`LOOK_UP_TO_CAT_ID` as `pivot_LOOK_UP_TO_CAT_ID`, `cat_artist`.`LOOK_UP_TO_ARTIST_ID` as `pivot_LOOK_UP_TO_ARTIST_ID` from `artist` inner join `cat_artist` on `artist`.`id` = `cat_artist`.`LOOK_UP_TO_ARTIST_ID` where `cat_artist`.`LOOK_UP_TO_CAT_ID` is null"
["bindings"]=> array(0) { }
["time"]=> float(0.37) } }
Все это происходит прежде, чем я возвращаю взгляд и передать данные в представление
Все остальное в запросе прав кроме это, где он ищет null
where `cat_artist`.`LOOK_UP_TO_CAT_ID` is null
должно быть это
where `cat_artist`.`LOOK_UP_TO_CAT_ID` = ?
Пожалуйста, помогите. Я не могу понять, где я пошло не так
EDIT
Вот мои DB таблицы - поливают вниз, показывая все COLS бы напрасной тратой
CREATE TABLE IF NOT EXISTS `artist` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ARTIST` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ARTIST` (`ARTIST`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE `catelogue` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`CAT_NO` varchar(255) DEFAULT NULL,
`TITLE` varchar(255) DEFAULT NULL,
`BARCODE` varchar(15) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `BARCODE` (`BARCODE`),
UNIQUE KEY `CAT_NO` (`CAT_NO`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `cat_artist` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`LOOK_UP_TO_CAT_ID` int(11) NOT NULL,
`LOOK_UP_TO_ARTIST_ID` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`ID`),
UNIQUE KEY `unique_index` (`LOOK_UP_TO_CAT_ID`,`LOOK_UP_TO_ARTIST_ID`),
KEY `LOOK_UP_TO_CAT_ID` (`LOOK_UP_TO_CAT_ID`),
KEY `LOOK_UP_TO_ARTIST_ID` (`LOOK_UP_TO_ARTIST_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Надеюсь ответ можно найти, почему он ставит is null
в заявлении, а не product ID
Также я проверил результ тины сырья SQl пути замены is null
с product id
и это делает работу в PhpMyAdmin, поэтому SQL сгенерирован правильно до is null
Я Flawed. Я создал тест db, изменил столбец на нижний регистр, и он сработал! Это здорово, что он работает, но теперь он представляет собой более серьезную проблему, потому что я не могу просто пойти и изменить весь мой код на нижний регистр. Не существует способа сказать laravel/eloquent не изменять имена столбцов в нижнем регистре и использовать имя в формате отформатированного? PS- Это кажется действительно глупой ошибкой, поскольку я объясняю настройку первичного ключа в модальном как 'ID' – Mark
Вам не нужно менять все столбцы на нижний регистр. достаточно изменить столбец «id». Если вам действительно нужно использовать новый db, попробуйте использовать мутаторы для модели. –
Я думал, что мутанты были правильными, но я был неправ. Мутаторы изменяют значение, а не ключ. После гораздо большего рытья я нашел правильный ответ – Mark