同时得到两个多态关系结果

问题描述 投票:0回答:2

来自 Laravel 文档 - 如果我有这种多对多的多态关系:

class Tag extends Eloquent {

    public function posts()
    {
        return $this->morphedByMany('Post', 'taggable');
    }

    public function videos()
    {
        return $this->morphedByMany('Video', 'taggable');
    }

}

所以我可以这样做:

$tag = Tag::find(1);
$posts = $tag->posts;
$videos = $tag->videos;

如何将所有标签关系作为一个结果?即在一对多多态关系中,您执行以下操作:

$tag = Tag::find(1);
$taggable = $tag->taggable;

但这在多对多关系中似乎对我不起作用 - 我收到此 SQL 错误:

SQLSTATE[42S22]:未找到列:1054 未知列“tag_groups”。 在“where 子句”中(SQL:select * from

tag_groups
where
tag_groups
.`` 为空限制 1)

php laravel eloquent laravel-4
2个回答
4
投票

您必须自己合并结果:

$taggable = $tag->posts->toBase()->merge($tag->videos);

这将返回

Illuminate\Support\Collection
的实例。

Eloquent 集合在这种情况下没有意义。


3
投票

您无法在一个结果中获得所有关系,但您可以使用如下方式急切地加载它们:

$tag = Tag::with(['posts', 'videos'])->find(1);
$relations = $tag->getRelations();

这里

$tag->getRelations()
将返回一组已加载的关系,因此您可以使用如下方式访问一个关系:

$posts = $relations['posts']; // Collection of Post models
$videos = $relations['videos']; // Collection of Video models

您可以像这样合并它们:

$allRelations = array_merge($posts->toArray(), $videos->toArray());

或者使用

merge
Illuminate\Support\Collection
方法(如
Joseph Silber
提到的)

$allRelations = $relations['posts']->toBase()->merge($relations['videos']);
© www.soinside.com 2019 - 2024. All rights reserved.