У меня есть две таблицы с именами ‘works’ и ‘slides’, а также два класса, которые расширяют Eloquent с именами ‘Work’ и ‘Slide’.
Внутри моей таблицы «работ» у меня есть столбец «id», столбец «title», столбец «description» и столбец «image», а внутри моей таблицы «slides» у меня есть составной ключ, использующий внешний ключ с двумя столбцами названный ‘id’ и ‘work_id’.
Вот как выглядит моя связь с базой данных:
Вот код для моего класса 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);
Однако, если я заменю вызов $ slide-> workId () на:
Work::find($slide->work_id)
затем он находит строку без проблем.
Что я должен сделать, чтобы функция возвращала объект Work вместо вызова Work :: find ()?
Слайд принадлежит Work, поскольку внешний ключ для works находится внутри таблицы слайдов. Вы также используете неправильное наименование для функции отношений и неверный синтаксис для 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
Примечание: вы используетеобъединение ()«для принадлежит», а не «push ()»
Других решений пока нет …