在我的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
模型中相同的结果?意味着结果合并没有重复。
非常感谢。
更新
由于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();
}
它大大减少了查询次数,结果也是一样。
答案 0 :(得分:6)
$this->thumbnail
与$this->thumbnail()->first()
相同,要获得一个集合,您可以尝试:
public function getImagesAllAttribute()
{
return $this->images->merge($this->thumbnail()->get());
}