Как определить удобный ярлык для доступа к отдаленным отношениям, между "OneToMany" и "manyToMany polymorphic"? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть три модели: "Article", "ArticleTranslation", Tag ".

Переводы статей на разных языках хранятся в ArticleTranslation.
Модель" Article"имеет отношение один ко многим с моделью " ArticleTranslation ", а модель " ArticleTranslation " имеет полиморфный многие ко многим связь с моделью " Tag ".
Мне нужно определить удобный ярлык, чтобы легко собрать все теги статьи для данной статьи, и мне нужно определить удобный ярлык, чтобы легко собрать все статьис указанным тегом. Relations

для перевода статьи, которую я использую переводимый с помощью laravel пакет.
таблицы этих отношений:
статьи:

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');
    }
}


Tag Модель:

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');
    }
}

1 Ответ

0 голосов
/ 10 октября 2019

Я нашел решение. Сначала установите этот пакет: 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:

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']]
        );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...