2014-10-03 5 views
3

У меня есть две таблицы с именем «works» и «slides», а также два класса, которые расширяют Eloquent с именем «Work» и «Slide». В моей таблице «works» у меня есть столбец «id», столбец «title», столбец «description» и столбец «image» и внутри моей таблицы «слайды». У меня есть составной ключ с использованием внешнего ключа с двумя столбцы с именем 'id' и 'work_id'.Laravel Eloquent hasOne возвращает пусто

Это как мои отношения базы данных выглядит: Database Relationship

Это код для моего класса Slide:

class Slide extends Eloquent { 

    public $timestamps = false; 

    public function workId() { 
     return $this->hasOne('work', 'work_id', 'id'); 
    } 

} 

И это код для моего класса работы:

class Work extends Eloquent { 

    public $timestamps = false; 

} 

Внутри моей индексной страницы Я пытаюсь получить объект Work, вызвав метод workId() внутри моего объекта Slide, но он возвращает пустое с помощью этого кода:

$slides = Slide::all(); 
$works = new \Illuminate\Database\Eloquent\Collection; 
foreach ($slides as $slide) { 
    $works->push($slide->workId()); 
} 
printf($works); 

Однако, если заменить вызов '$ слайд-> workId()' с:

Work::find($slide->work_id) 

затем находит строку без проблем.

Что мне нужно сделать, чтобы вернуть функцию Work, вместо вызова Work :: find()?

ответ

2

Слайд принадлежит работе, потому что внешний ключ работает внутри таблицы слайдов. Вы также используете неправильное имя для функции отношений и неправильный синтаксис для hasOne.

Вы должны использовать:

class Slide extends Eloquent { 

    public $timestamps = false; 

    public function work() { 
     return $this->belongsTo('Work'); 
     //or return $this->belongsTo('Work', 'work_id', 'id'); 
    } 

} 

Чтобы получить работу, которая принадлежит к слайду: $slide->work

Примечание: вы используете "association()" для belongsTo, а не "толчок()"

+0

Понимаю. Извините, я не слишком хорош с отношениями с базой данных, но теперь понимаю. Спасибо за объяснение. –

+0

@LiamPotter, кроме того, я бы предложил использовать загрузку для этого цикла. Вы можете найти подробную информацию об этом в URL-адресе, с которым я связан. – TonyArra

+0

Нравится так? http://pastebin.com/D8stebG1 –

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