/ / Об'єднання результатів належитьToMany та належитьДо стосунків у Красномовному - laravel, laravel-4, красномовно

Об'єднання результатів належитьToMany та належитьДо стосунків у Красномовному - laravel, laravel-4, красномовно

В моєму Image модель У мене два стосунки зі своїми Article модель, один-багато-багато і один-багато-багато:

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 модель? Це означає, що результати об'єднуються без дублікатів.

Велике дякую.

Оновлення:

З тих пір, як Бритва змусила мене зрозуміти це $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();
}

Це різко зменшило кількість запитів, і результат той самий.

Відповіді:

6 за відповідь № 1

$this->thumbnail такий же, як і $this->thumbnail()->first(), щоб отримати колекцію, ви можете спробувати:

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