2014-09-28 3 views
5

В моей Image модели у меня есть два отношения с моей Article модели, одна многие-ко-многим и один один-ко-многим:Присоединяемое результаты belongsToMany и belongsTo отношений в красноречивых

public function articlesAlbums() 
{ 
    return $this->belongsToMany('Article', 'article_image', 'image_id', 'article_id')->publishedFilter(); 
} 

public function articleThumb() 
{ 
    return $this->hasMany('Article')->publishedFilter(); 
} 

Я сливаться результаты из них, чтобы получить все изображения, используемые Article:

public function getArticlesAllAttribute() 
{ 
    return $this->articlesAlbums->merge($this->articleThumb); 
} 

в моей Article модели у меня есть два отношения с моей Image модели:

public function images() 
{ 
    return $this->belongsToMany('Image', 'article_image', 'article_id', 'image_id'); 
} 

public function thumbnail() 
{ 
    return $this->belongsTo('Image', 'image_id'); 
} 

Я хотел бы объединить эти, а также, так же, как я делаю в моей Image модели:

public function getImagesAllAttribute() 
{ 
    return $this->images->merge($this->thumbnail); 
} 

Но это не работает, это, кажется, потому что мои отношения миниатюра belongsTo, не hasMany , Так что, возможно, это не коллекция. Когда я пытаюсь я получаю исключение:

Call to a member function getKey() on a non-object 

Я попытался преобразовать его в коллекцию с:

new Collection($this->thumbnail) 

но получаю сообщение об ошибке сказав:

__construct() must be of the type array, object given 

Как я могу объединить $this->images и $this->thumbnail в моей модели Article, чтобы получить те же результаты, что и в моей модели Image? Это означает, что результаты объединены без дубликатов.

Большое спасибо.

Update:

С Бритва меня понял, что $this->thumbnail не на самом деле вернуть коллекцию, а один объект он заставил меня пересмотреть, если merge действительно правильная функция для использования.

return $this->images->merge($this->thumbnail()->get()); 

Это, казалось, вызывало массу ненужных запросов, хотя я и требовал загрузки.

Так что я в конечном итоге делает это вместо:

public function getImagesAllAttribute() 
{ 
    $imagesAll = $this->images; 
    if (! is_null($this->thumbnail)) $imagesAll->add($this->thumbnail); 

    return $imagesAll->unique(); 
} 

Это резко сократило число запросов, а результат тот же.

+0

Отъезд [этот вопрос] (http://stackoverflow.com/questions/21615656/get-array-of -eloquent-модель-отношения). Он может пролить свет на то, как вы достигнете своего результата. То, что вы сейчас пытаетесь сделать, просто не сработает. –

ответ

6

$this->thumbnail такой же, как $this->thumbnail()->first(), чтобы получить коллекцию, вы можете попробовать:

public function getImagesAllAttribute() 
{ 
    return $this->images->merge($this->thumbnail()->get()); 
} 
+0

Это работает! И имеет смысл (теперь, когда вы указали это). Спасибо за это :) –

+0

Добро пожаловать, рад, что я мог бы помочь. – Razor

+0

Даже не знал об этом! Благодаря! – Notflip

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