В моєму 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());
}