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

时间:2014-09-28 20:50:51

标签: laravel laravel-4 eloquent

在我的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->thumbnailArticle,以获得与Image模型中相同的结果?意味着结果合并没有重复。

非常感谢。

更新

由于Razor让我意识到$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();
}

它大大减少了查询次数,结果也是一样。

1 个答案:

答案 0 :(得分:6)

$this->thumbnail$this->thumbnail()->first()相同,要获得一个集合,您可以尝试:

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