Имеем следующие таблицы:
articles
id
article_images
article_id
image_id
images
id
url
и модели:
<?php
class Article extends Eloquent {
public function articleImages()
{
return $this->hasMany('ArticleImage', 'article_id', 'id');
}
}
class ArticleImage extends Eloquent {
public function article()
{
return $this->belongsTo('Article', 'article_id', 'id');
}
public function image()
{
return $this->belongsTo('Image', 'image_id', 'id');
}
}
class Image extends Eloquent {
public function articleImages()
{
return $this->hasOne('ArticleImage', 'image_id', 'id');
}
}
Задача: получить список изображений
Image
из модели
Article
, используя отношения, например:
<?php
foreach (Article::find($id)->images as $image)
{
var_dump($image->url);
}
Напрашивается отношение
hasManyThrough
:
class Article extends Eloquent {
public function images()
{
return $this->hasManyThrough('Image', 'ArticleImage');
}
}
Но
hasManyThrough
не учитывает отношения прописанные в других моделях и не позволяет прописать отношение между моделями
Image
и
ArticleImage
(точнее, позволяет, но частично) и пытается джойнить таблицы по
article_images.id = images.id
, где можно выбрать только
images.id
.
Если же попробовать выводить через
articleImage
получаем ошибку:
foreach (Article::find($id)->articleImages as $articleImage)
{
var_dump($articleImage->image->url); // ErrorException: Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation
}
Гугл предлагает использовать такой способ:
class ArticleImage extends Eloquent {
public function image()
{
return $this->belongsTo('Image', 'image_id', 'id');
}
public function getImageUrl()
{
return $this->image->url;
}
}
foreach (Article::find($id)->articleImages as $articleImage)
{
var_dump($articleImage->imageUrl);
}
Что мягко говоря не удобно, т.к. необходимо прописывать геттер к каждому полю таблицы
images
.
Может есть какой-то вариант правильно настроить hasManyThrough, который я пропустил? Очень не хочется изменять названия полей в БД или расписывать геттеры.