在Eloquent中合并来自belongsToMany和belongsTo关系的结果

Tho*_*sen 5 laravel eloquent 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();
}
Run Code Online (Sandbox Code Playgroud)

我合并了这些结果,以获得所有使用的图像Article:

public function getArticlesAllAttribute()
{
    return $this->articlesAlbums->merge($this->articleThumb);
}
Run Code Online (Sandbox Code Playgroud)

在我的Article模型中,我与我的Image模型有两种关系:

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

public function thumbnail()
{
    return $this->belongsTo('Image', 'image_id');
}
Run Code Online (Sandbox Code Playgroud)

我想合并这些,就像我在Image模型中一样:

public function getImagesAllAttribute()
{
    return $this->images->merge($this->thumbnail);
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,似乎是因为我的缩略图关系belongsTo不是hasMany.所以也许它不是一个集合.当我尝试时,我得到一个例外:

Call to a member function getKey() on a non-object
Run Code Online (Sandbox Code Playgroud)

我尝试将其转换为集合:

new Collection($this->thumbnail)
Run Code Online (Sandbox Code Playgroud)

但得到一个错误说:

__construct() must be of the type array, object given
Run Code Online (Sandbox Code Playgroud)

我怎么能合并$this->images,并$this->thumbnail在我的Article模型中,得到的是我在做同样的结果Image模式?意味着结果合并没有重复.

非常感谢.

更新:

由于Razor让我意识到$this->thumbnail实际上并没有返回一个集合,而是一个单独的对象,它让我重新思考是否merge真的是正确使用的功能.

return $this->images->merge($this->thumbnail()->get());
Run Code Online (Sandbox Code Playgroud)

这似乎导致了许多不必要的查询,即使我是急切的加载.

所以我最终做了这样的事情:

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

    return $imagesAll->unique();
}
Run Code Online (Sandbox Code Playgroud)

它大大减少了查询次数,结果是一样的.

Raz*_*zor 6

$this->thumbnail是一样的$this->thumbnail()->first(),得到一个集合,您可以尝试:

public function getImagesAllAttribute()
{
    return $this->images->merge($this->thumbnail()->get());
}
Run Code Online (Sandbox Code Playgroud)