Преобразование запроса MySQL в конструктор запросов Laravel - PullRequest
0 голосов
/ 14 октября 2019

Я работаю с Laravel впервые. У меня есть (например, для упрощения понимания отношений) книги , авторы , author_book и описания таблицы. И мне нужна таблица описания как отдельная таблица, не спрашивайте меня, почему.

Итак, я написал запрос MySQL, чтобы показать вам мои намерения. У него есть подзапрос, чтобы сначала получить всех авторов в виде строки.

    SELECT temp.book_id, temp.names, books.title FROM descriptions 
        LEFT JOIN books ON descriptions.book_id = books.id 
        LEFT JOIN (     
            SELECT author_book.book_id, GROUP_CONCAT(authors.name ORDER BY authors.name SEPARATOR ', ') as names FROM author_book 
                LEFT JOIN authors ON author_book.author_id = authors.id 
            GROUP BY author_book.book_id) temp ON temp.book_id = books.id 
    ORDER BY temp.names, books.title

Этот запрос извлекает список всех книг, которые имеют описание, и упорядочивает их по авторам и названиям. Как здесь:

  • Алекс Бэнкс, Ив Порчелло - Учебное реагирование: функциональная веб-разработка с React и Redux
  • Шарлотта Лукас - Dein perfektes Jahr: Roman
  • Шарлотта Лукас - Ваш идеальный год: новое издание Kindle Edition Марк
  • Гарро, Уилл Фо - Redux в действии

У меня вопрос Как мне сделатьто же самое с помощью построителя запросов Laravel?

Ответы [ 3 ]

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

Вы использовали hasOne и hasMany Отношения в классе модели laravel.

Во-первых, вам нужно научиться использовать модель соединения в laravel с первичным ключом к внешнему ключу.

для получения дополнительной информации, вам нужно обратиться по этому URL, чтобы присоединиться к запросу в laravel.

Пожалуйста, проверьте ниже URL для запроса присоединения

https://laravel.com/docs/5.8/eloquent-relationships

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

Комментарий от Алекс Герреро был действительно полезным. Мое решение основано на этом. Совет от Saly 3301 по использованию онлайн-конвертера https://pontaku -tools.com / english / может быть полезен, но инструмент плохо работает со сложными запросами.

Я также нашел способ проверить, какую строку sql строит запрос . В экземпляре построителя запросов можно вызвать метод -> toSql (). Вы должны сделать это до вызова методов -> get () или -> paginate ().

    $sql = DB::table('users')->toSql();
    var_dump($sql);

Мое окончательное решение для Laravel 5.8:

    $joined_authors = DB::table('author_book')
        ->select('author_book.book_id', DB::raw('GROUP_CONCAT(authors.name ORDER BY authors.name SEPARATOR ", ") as names'))
        ->leftJoin('authors', 'author_book.author_id', '=', 'authors.id')
        ->groupBy('author_book.book_id');

    $books_with_description = DB::table('descriptions')
        ->leftJoin('books', 'descriptions.book_id', '=', 'books.id')
        ->leftJoinSub($joined_authors, 'joined_authors', function ($join) {
            $join->on('joined_authors.book_id', '=', 'books.id');
        })
        ->orderBy('joined_authors.names')
        ->orderBy('books.title')
        ->paginate(15);
0 голосов
/ 14 октября 2019

вы можете сделать это так

$subJoin = 
author_book::select('author_book.book_id',DB::raw('GROUP_CONCAT(authors.name ORDER BY 
authors.name SEPARATOR ', ') as names'))
->leftJoin('authors','author_book.author_id','=','authors.id')
->groupBy(author_book.book_id)
->get();

$query = descriptions::leftJoin('books','books.id','=','descriptions.book_id')
                  ->joinSub($subJoin,'temp',function ($join) {
                    $join->on('temp.book_id', '=', 'books.id');

                })->orderBy('temp.names', 'books.title')
                  ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...