检索Laravel Eloquent中的所有morphedByMany关系

时间:2016-03-11 19:13:02

标签: php laravel eloquent polymorphism

在Laravel文档中,有以下示例用于检索morphedByMany关系,这是多对多的多态关系。

Laravel Many to Many polymorphic relations documentation

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    /**
     * Get all of the posts that are assigned this tag.
    */
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'taggable');
    }

    /**
     * Get all of the videos that are assigned this tag.
     */
    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}

如何在一个查询/集合中获取所有morphed关系的列表,例如postsvideos,然后如果我稍后添加photos(或其他什么),那也是?

3 个答案:

答案 0 :(得分:3)

您是否认为使用集合的“union”功能合并所有不同的集合以便检索所需的所有内容?

class Tag extends Model
{
    [...]

    /**
     * Get all of.
     */
    public function morphed()
    {
        return $this->video->union($this->posts)->all();
    }
}

答案 1 :(得分:0)

我在这里使用一个把戏:

为连接表Taggable创建模型taggable,并为hasMany模型添加Tag关系。

public function related()
{
    return $this->hasMany(Taggable::class);
}

在您的Taggable模型中,创建一个morphedTo关系。

public function taggables()
{
    return $this->morphTo();
}

现在,您可以通过调用以下命令获取所有正在使用该标记的模型:

$tagged = Tag::with('related.taggables');

答案 2 :(得分:-2)

您应该可以在Tag类上添加关系

public function taggable()
{
    return $this->morphedTo();
}

这将使用taggable_id和taggable_type来获取与之相关的相关模型。