Пустой вывод отношения Laravel HasManyThrough

Мне нужна помощь с отношениями красноречивой модели Laravel. У меня есть три таблицы:

элементы

item_id
slideshowID

слайд-шоу

slideshow_id

изображения

image_id
slideshowID

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

модель элемента

public function images(){   
    return $this->hasManyThrough(
        'App\image','App\slideshow','slideshow_id','slideshowID','slideshowID'
    );}

контроллер

$items=item::with('images')->get();
return \View::make('home')->with('items', $items);

Просмотреть

    @foreach($items as $item)
        <div class='item' data-categoryid='{{$item->categoryID}}'>
        <div class='item-image'>
            @foreach($item->images as $image)
                <img src='{{URL::asset($image->path)}}' data-image-id='{{$image->image_id}}' style='display:none'>
            @endforeach 
        </div>
        <div class='item-name'>{{$item->name}}</div>
        <div class='item-price'>Od {{$item->price}}&euro;</div>
            <button class='btn-blue'>Več...</button>
        </div>
    @endforeach

Запрос

select `images`.*, `slideshows`.`slideshow_id` from `images` inner join `slideshows` on `slideshows`.`slideshow_id` = `images`.`slideshowID` where `slideshows`.`slideshow_id` in (?, ?, ?, ?, ?, ?, ?)" array(7) { [0]=> int(1) [1]=> int(7) [2]=> int(2) [3]=> int(6) [4]=> int(3) [5]=> int(4) [6]=> int(5) }

Вывод – массив пустых изображений

{"items_id":1,"code":"999","name":"koledar","description":"","slideshowID":1,"stock":999,"price":5.5,"categoryID":2,"images":[]}

EDIT Мне удалось вытащить несколько изображений, но они не те.

Item: 3
Slideshow fk:2
Slideshow id:3
9 images/bon2.jpg 
Slideshow id:3
10 images/bon.jpg 

Он всегда получает слайд-шоу, равное идентификатору элемента. Я попытался добавить в модель элемента protected $foreignKey='slideshowID', но ничего не меняет.


person Troix    schedule 10.01.2017    source источник
comment
Я также пробовал с $this-›belongsToMany, и я также получил пустой массив, что я делаю неправильно?   -  person Troix    schedule 10.01.2017


Ответы (2)


Вы очень близки, просто нужно немного изменить модель slideshows, вам нужно добавить туда первичный ключ

protected $primaryKey = 'slideshow_id';//https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L56

Это необходимо, потому что при вызове hasManyThrough см. здесь https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L875-L886 он вызывает

person ARIF MAHMUD RANA    schedule 10.01.2017
comment
Привет! Спасибо за ваш ответ, я думаю, что сделал это в своей модели слайд-шоу, но, возможно, я прокомментировал /* */ это по какой-то причине, я сейчас дома, я попробую завтра и отчитаюсь. Спасибо! - person Troix; 10.01.2017
comment
Я добавил защищенный $primaryKey к элементу, модели слайд-шоу, я получаю изображения на выходе, но я получаю неправильные изображения. Посмотреть изменить - person Troix; 11.01.2017

Я решил это. У меня были неправильно настроены таблицы базы данных. Вместо этого, если у вас есть такие таблицы:

элементы

item_id
slideshowID

слайд-шоу

slideshow_id

картинки

image_id
slideshowID

я поменял их на

элементы

item_id

слайд-шоу

slideshow_id
item_id

картинки

image_id
slideshowID
person Troix    schedule 11.01.2017