2016-05-14 8 views
1

У меня есть 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

ответ

1

После многих копаний я обнаружил, что использовал неправильный var, чтобы установить $primaryKey. Я использовал $primary_id.Как и где я поднял это я не знаю, но это, кажется, основная причина, потому что я не изменял PrimaryKey вара, а объявить новую один - Глупой ошибку


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

Убедитесь, что вы задаете правильную переменную.

Обертывание pre тега вокруг моего var_dump помогает читать большой obeject/массив и помог мне найти проблему

1

Это может звучит глупо, но я думаю, что это beacuse ваши имен полей заглавных букв. поэтому laravel не может найти столбец id в списке атрибутов в модели Project. поэтому он предполагает, что вы ищете нулевые идентификаторы. Итак, по крайней мере переименуйте ID столбцы на id (в нижнем регистре).

+0

Я Flawed. Я создал тест db, изменил столбец на нижний регистр, и он сработал! Это здорово, что он работает, но теперь он представляет собой более серьезную проблему, потому что я не могу просто пойти и изменить весь мой код на нижний регистр. Не существует способа сказать laravel/eloquent не изменять имена столбцов в нижнем регистре и использовать имя в формате отформатированного? PS- Это кажется действительно глупой ошибкой, поскольку я объясняю настройку первичного ключа в модальном как 'ID' – Mark

+0

Вам не нужно менять все столбцы на нижний регистр. достаточно изменить столбец «id». Если вам действительно нужно использовать новый db, попробуйте использовать мутаторы для модели. –

+0

Я думал, что мутанты были правильными, но я был неправ. Мутаторы изменяют значение, а не ключ. После гораздо большего рытья я нашел правильный ответ – Mark

Смежные вопросы