Получить данные из нескольких таблиц в Laravel 5,7 (красноречиво) - PullRequest
0 голосов
/ 19 февраля 2020

Я использую Laravel 5.7. У меня есть три MySQL таблицы, названные: фильмы, фильм_директоры, фильм_акторы . У меня проблемы с получением данных из этих таблиц. Посмотрите на мою структуру таблицы:

movies
|-----------------------------------------------------|
|   id  |   title       |   release |  img_url        |
|-----------------------------------------------------|
|  1    |  Avengers     |    2019   |    #            |
|-----------------------------------------------------|
|  2    |  Avatar       |    2009   |    #            |
|-----------------------------------------------------|
|  3    |  Titanic      |    1997   |    #            |
|-----------------------------------------------------|

directors
|-----------------------------------------------------|
|   id  |   movie_id  |   dir_name      |  add_date   |
|-----------------------------------------------------|
|  1    |    1        |  Anthony Russo  |  2019/02/18 |
|-----------------------------------------------------|
|  2    |    1        |    Joe Russo    |  2019/02/18 |
|-----------------------------------------------------|
|  3    |    2        |    Cameron      |  2019/02/18 |
|-----------------------------------------------------|

actors
|-----------------------------------------------------|
|   id  |   movie_id  |   act_name      |  add_date   |
|-----------------------------------------------------|
|  1    |    1        |  Robert Downey  |  2019/02/18 |
|-----------------------------------------------------|
|  2    |    1        |   Chris Evans   |  2019/02/18 |
|-----------------------------------------------------|
|  3    |    1        |  Mark Ruffalo   |  2019/02/18 |
|-----------------------------------------------------|
|  4    |    1        |   Chris Pratt   |  2019/02/18 |
|-----------------------------------------------------|
|  5    |    2        |   Worthington   |  2019/02/18 |
|-----------------------------------------------------|
|  6    |    2        |    Weaver       |  2019/02/18 |
|-----------------------------------------------------|
|  7    |    2        |    Saldana      |  2019/02/18 |
|-----------------------------------------------------|

I Want
|-------------------------------------------------------------------------------------------------------------------------------------------|
|   id  |   title       |   release |  img_url    |        directors           |                        actors                              |
|-------------------------------------------------------------------------------------------------------------------------------------------|
|  1    |  Avengers     |    2019   |    #        | Anthony Russo, Joe Russo   |  Robert Downey, Chris Evans, Mark Ruffalo, Chris Pratt     | 
|-------------------------------------------------------------------------------------------------------------------------------------------|
|  2    |  Avatar       |    2009   |    #        |     Cameron                |  Worthington, Weaver, Saldana                              |
|-------------------------------------------------------------------------------------------------------------------------------------------|
|  3    |  Titanic      |    1997   |    #        |                            |                                
|-------------------------------------------------------------------------------------------------------------------------------------------|

Текущий код, который я использую:

$movie_list = DB::table('movies')
            ->select('movies.*', 'movie_directors.*', 'movie_actors.*', 'movie_genres.*', 'movie_links.*', 'movie_types.*')
            ->join('movie_directors','movies.id', '=','movie_directors.movie_id')
            ->join('movie_actors', 'movies.id', '=', 'movie_actors.movie_id')
            ->where('movies.status',1)
            ->paginate(50)
            ;

Посмотрите на таблицу «Я хочу» в нижней части кода. Это то, что я хочу. Пожалуйста, не прикрепляйте ссылку ниже как доказательство ответа. Это не соответствует моему требованию
, как получить данные из нескольких таблиц в laravel eloquent

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Чтобы добиться этого, вам нужно сгруппировать результаты по movies.id и использовать group_concat для извлечения результатов, связанных через запятую. Ваш код должен выглядеть примерно так:

$movie_list = DB::table('movies')
    ->select(
        'movies.*', 
        DB::raw('group_concat(movie_directors.dir_name) as directors'),
        DB::raw('group_concat(movie_actors.act_name) as actors')
    )
    ->join('movie_directors','movies.id', '=','movie_directors.movie_id')
    ->join('movie_actors', 'movies.id', '=', 'movie_actors.movie_id')
    ->where('movies.status',1)
    ->groupBy('movies.id')
    ->paginate(50)
    ; 

Подробнее о group_concat можно прочитать здесь: https://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php

0 голосов
/ 19 февраля 2020

Я отвечаю на свой вопрос, потому что думаю, что это поможет другим и сэкономит драгоценное время.

 $movie_list = DB::table('movies')
            ->select( 'movies.id', 'movies.title', 'movies.release_year', 'movies.img_url', 'plot', 'imdb_rating', 'rotten_rating', 'meta_rating', 'status',
            DB::raw('group_concat(DISTINCT(movie_directors.director_name) SEPARATOR ',') as directors'),
            DB::raw('group_concat(DISTINCT(movie_actors.actor_name)) as actors'),
            DB::raw('group_concat(DISTINCT(movie_genres.genre)) as genres'),
            DB::raw('group_concat(DISTINCT(movie_links.movie_link)) as links'),
            DB::raw('group_concat(DISTINCT(movie_links.link_type)) as link_types'),
            DB::raw('group_concat(DISTINCT(movie_types.movie_type)) as movie_types')
            )
            ->join('movie_directors','movies.id', '=','movie_directors.movie_id')
            ->join('movie_actors', 'movies.id', '=', 'movie_actors.movie_id')
            ->join('movie_genres', 'movies.id', '=', 'movie_genres.movie_id')
            ->join('movie_links', 'movies.id', '=', 'movie_links.movie_id')
            ->join('movie_types', 'movies.id', '=', 'movie_types.movie_id')
            ->groupBy('movies.id', 'movies.title', 'movies.release_year', 'movies.img_url', 'plot', 'imdb_rating', 'rotten_rating', 'meta_rating', 'status')
            ->paginate(50) ;
...