如何在 "OneToMany" 和 "manyToMany polymorphic" 之间定义访问远距离关系的便捷快捷方式?

how to define a convenient shortcut for accessing distant relations, between "OneToMany" and "manyToMany polymorphic"?

我有三个模型:"Article"、"ArticleTranslation"、Tag"。

不同语言的文章翻译存储在 ArticleTranslation 中。
Article”模型与“ArticleTranslation”模型具有一对多关系,并且“ArticleTranslation”模型与“Tag”模型具有多对多多态关系.
我需要定义一个方便的快捷方式来轻松收集给定文章的所有文章标签,我需要定义一个方便的快捷方式来轻松收集具有给定标签的所有文章。

我使用 laravel-translatable 包翻译文章。
此关系表:
文章:

id - integer

article_translations:

id - integer
article_id - integer
locale - string
title - string
slug - string

标签:

id - integer
name - string
slug - string

标签:

tag_id - integer
taggable_id - integer
taggable_type - string

文章模型:

class Article extends Model
{
    use Translatable;
    public $translatedAttributes = ['title', 'slug', 'description', 'body'];
}


文章翻译模型:

class ArticleTranslation extends Model
{
    use Sluggable;
    public $timestamps = false;
    protected $fillable = ['title', 'slug', 'description', 'body'];

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title',
            ],
        ];
    }

    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}


标签型号:

lass Tag extends Model
{
    use Sluggable;
    protected $fillable = ['name'];
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'name',
            ],
        ];
    }

    public function articleTranslate()
    {
        return $this->morphedByMany(ArticleTranslation::class, 'taggable');
    }
}

我找到了解决方案。 首先安装这个包: https://github.com/staudenmeir/eloquent-has-many-deep HasManyThrough 的这个扩展版本允许与无限中间模型的关系。

其次,在文章模型中定义articleTags():

class Article extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
    public function articleTags()
    {
        return $this->hasManyDeep(
            Tag::class,
            [ArticleTranslation::class, 'taggables'],
            [null, ['taggable_type', 'taggable_id'], 'id'],
            [null, null, 'tag_id']
        );
    }
}

三、在Tag Model中定义articles():

class Tag extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
    public function articles()
    {
        return $this->hasManyDeep(
            ArticleTranslation::class,
            ['taggables', Article::class],
            [null, 'id'],
            [null, ['taggable_type', 'taggable_id']]
        );
    }
}