Как выстроить отношения между Eloquent моделями Laravel 5?

Имеем следующие таблицы:
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, который я пропустил? Очень не хочется изменять названия полей в БД или расписывать геттеры.
  • Вопрос задан
  • 5942 просмотра
Решения вопроса 1
cha-cha
@cha-cha
class Article extends Eloquent{
    public function images(){
        return $this->belongsToMany('Image', 'article_images', 'article_id', 'image_id');
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы