Laravel:如何创建hasManyThrough多态多对多关系?

时间:2019-04-10 23:55:15

标签: php laravel relationship laravel-5.7

情况

我有以下模型

  • Post
  • Video
  • Tag

这些存储在数据库表中:

  • posts(具有idname列)
  • videos(具有idname列)
  • tags(具有idname列)

还有一个表taggables,其中包含以下列:

  • tag_idTag的ID)
  • taggable_idPostVideo的ID)
  • taggable_typeApp\PostApp\Video

PostVideo模型都具有与morphToMany的{​​{1}} 关系

Tag

并且public function tags() { return $this->morphToMany('App\Tag', 'taggable'); } 模型的逆Tag 关系设置为:

morphedByMany

(到目前为止,它可以正常工作,并且完全符合Laravel Docs中的描述。)

现在,除此以外,我还有一个public function posts() { return $this->morphedByMany('App\Post', 'taggable'); } public function videos() { return $this->morphedByMany('App\Video', 'taggable'); } 模型,该模型与TagGroup具有One-to-Many关系,因此多个标签可以属于一个标签组。 (使用Tag表中的hasMany('App\Tag')列使用belongsTo('App\TagGroup')tag_group_id。)

问题

如何在tags模型与TagGroupPost模型之间建立关系? (例如,获取所有已贴有特定组标签的帖子。)

我知道这里有Video,但这似乎不适用于多对多多态关系作为中介。还是我做错了什么?

还使用hasManyThroughMorphPivot定义了自定义中间表,但是文档对此并不清楚。

可以在没有任何其他插件/框架的情况下完成吗?

1 个答案:

答案 0 :(得分:0)

不确定这是否正是您所需要的,但是我有此设置

广告系列--(morphedByMany)-> 文章-(HasMany)-> 标签

将活动和文章链接起来的数据透视表(model_campaign)具有以下结构:

model_id | model_type | campaign_id

我得到了这样的关系方法:

class Campaign extends Model
{
    public function tags(): HasManyThrough
    {
        return $this
            ->hasManyThrough(Tag::class, Article::class, 'model_campaign.campaign_id')
            ->join('model_campaign', function ($join) {
                $join
                    ->on('model_campaign.model_id', '=', 'articles.id')
                    ->where('model_campaign.model_type', Article::class);
            });
    }
}

我还没有详细测试它,但是乍看之下似乎还可以