获得两个多态关系结果

时间:2014-06-15 15:37:28

标签: laravel laravel-4 eloquent

From the Laravel documentation - 如果我有这种多对多的多态关系:

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)

2 个答案:

答案 0 :(得分:4)

您必须自己合并结果:

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

这将返回Illuminate\Support\Collection

的实例

在这种情况下,一个雄辩的集合是没有意义的。

答案 1 :(得分: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']);