情况
我有以下模型:
Post
Video
Tag
这些存储在数据库表中:
posts
(具有id
和name
列)videos
(具有id
和name
列)tags
(具有id
和name
列)还有一个表taggables
,其中包含以下列:
tag_id
(Tag
的ID)taggable_id
(Post
或Video
的ID)taggable_type
(App\Post
或App\Video
) Post
和Video
模型都具有与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
模型与TagGroup
和Post
模型之间建立关系? (例如,获取所有已贴有特定组标签的帖子。)
我知道这里有Video
,但这似乎不适用于多对多多态关系作为中介。还是我做错了什么?
还使用hasManyThrough
和MorphPivot
定义了自定义中间表,但是文档对此并不清楚。
可以在没有任何其他插件/框架的情况下完成吗?
答案 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);
});
}
}
我还没有详细测试它,但是乍看之下似乎还可以