принадлежит ToMany с несколькими таблицами (предложение дизайна) - PullRequest
0 голосов
/ 18 марта 2019

У меня есть 5 таблиц в моем проекте laravel / vue:

  • Фильмы
  • Сериалы
  • Аниме
  • Актеры
  • Отношения актеров

Таблица актеров относится к фильмам, сериалам, аниме, и это отношение многих ко многим зарегистрировано в actors_relationship.

Я могу создать отношение «многие ко многим» в модели Actor.php, используя следующий код:

public function movies() {
    return $this->belongsToMany(MovieModel::class, "actors_relationship", 'actor_id', 'media_id')->wherePivot("media_type", AdminHelper::TYPE_MOVIES['value'])->withTimestamps();
}

Используя этот код, я получаю записи свключил в себя идентификатор актера и имеет специальный int как media_type.

До этого момента у меня не было проблем.Моя проблема заключается в подсчете всех этих отношений.например, получение количества фильмов, сериалов, аниме и их сортировка. desc / asc

Решения:

  1. Получение количества актеров отношений из фильмов, сериал, аниме и зарегистрируй его в кастоме attribute.Сортировка будет на стороне клиента.

  2. Выполнение жесткого кода на стороне сервера для сортировки, затем проверка, выполняется ли сортировка по total_count, если да, то сначала получить коллекцию, а затем ->get() команда, попробуйте выполнить сортировку по пользовательскому attribute.

Я хотел бы следовать рекомендациям по этому вопросу.Есть ли способ подсчитать все отношения и отсортировать по ним?

Решение на стороне клиента потребовало бы больше работы, потому что этот проект будет предназначен для Android и Web и, следовательно, потребует различных модификаций в обоих полях.

Кроме того, я обычно делал бы ->with('movies') изатем отсортируйте автоматически созданное поле movies_count.Я хотел бы иметь подобный подход.

Таблицы:

actors:

id actor_title

movies:

id movie_title 

series:

id series_title 

anime:

id anime_title

actors_relationship:

id actor_id media_id media_type

РЕДАКТИРОВАТЬ:

Я ищу лучшееСоветы по реализации общего подсчета movies, series и anime.Это означает, что я хотел бы общее количество этих 3 отношений в одной области.Я мог бы использовать пользовательский атрибут, но тогда мне нужно будет отсортировать его, используя PHP / клиентскую сторону вместо того, чтобы делать это в запросе SQL в Eloquent.

Это означает, что я ищу лучший путь, который следует лучшим практикам.total_count подведет итоги вышеупомянутых отношений.Я хотел бы отсортировать по этому новому total_count.

1 Ответ

2 голосов
/ 19 марта 2019

Это похоже на хороший случай для MorphToMany https://laravel.com/docs/5.8/eloquent-relationships#many-to-many-polymorphic-relations

    class Actor

    public function movies()
        {
            return $this->morphedByMany(MovieModel::class,'media',"actors_relationship");
        }

/// Add a the count to the query 

    public function scopeWithRelationsCount($q)
    {
        /// this is needed to so we keep the select of all the table columns too
        if(!$q->getQuery()->columns){
            $q->select($this->getTable().'.*');
        }

        return $q->selectSub(

                ActorRelationship::selectRaw('count(*)')->whereColumn('actor_id', 'actors.id'),

                'relations_count' /// the alias we are using could be anything  
            )
    }

Тогда, если вам нужно общее количество серий, фильмов и аниме для каждого актера, заказанного большинством, вы можете использовать.Actor::withRelationsCount()->orderBy('relations')->get()

Есть некоторые макросы, которые делают этот вид немного приятнее.Взгляните на https://github.com/reinink/advanced-eloquent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...