laravel - 合并 Eloquent 中belongsToMany 和belongsTo 关系的结果

标签 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

如何在我的 Article 模型中合并 $this->images$this->thumbnail 以获得与我相同的结果在我的 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();
}

大大减少了查询次数,而且结果是一样的。

最佳答案

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

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

关于laravel - 合并 Eloquent 中belongsToMany 和belongsTo 关系的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26089534/

相关文章:

php - 查询生成器上的 laravel orderByRaw()

php - laravel Eloquent 一对一保存关系

laravel - 如果元素(多个元素)将在几天后过期,如何通知管理员-Laravel

php - 具有 Eloquent ORM 的 Slim 3 - 集合中不存在关系

json - 如何向 Laravel 分页 json 响应添加自定义属性

php - Laravel 查询生成器加入 LIKE

php - Laravel-eloquent:调用未定义的方法 Illuminate\Database\Eloquent\Collection::where()

php - 如何将文件从一个位置移动到另一个位置?

php - 返回 GuzzleHttp 响应对象会导致浏览器中出现 ERR_INVALID_CHUNKED_ENCODING

php - 如何取消mandrill中预定的电子邮件?