将mysql查询转换为Laravel查询生成器

时间:2019-10-14 15:47:39

标签: php mysql laravel eloquent

我是第一次与Laravel合作。我有(例如,为了使关系易于理解)作者 author_book 描述表。而且我需要 descriptions 表作为单独的表,不要问我为什么。

所以,我写了一些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

此查询检索具有说明的所有书籍的列表,并按作者和书名排序。就像这里:

  
      
  • Alex Banks和Eve Porcello-学习React:使用React和Redux进行功能性Web开发
  •   
  • 夏洛特·卢卡斯(Charlotte Lucas)-Dein perfektes Jahr:罗马人
  •   
  • 夏洛特·卢卡斯-完美的一年:一部新颖的Kindle版Marc
  •   
  • Garreau,Will Faurot-行动中的Redux
  •   

我的问题是如何使用Laravel查询生成器来做同样的事情?

3 个答案:

答案 0 :(得分:0)

您可以像这样

$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();

答案 1 :(得分:0)

您已经在laravel模型类中使用了hasOnehasMany关系。

首先,您需要学习如何在laravel中使用主键为外键的联接模型。

有关更多信息,您需要引用此URL才能在laravel中加入查询。

请在下面的URL中查询加入查询

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

答案 2 :(得分:0)

亚历克斯·格雷罗(Alex Guerrero)的评论真的很有帮助。我的解决方案基于此。 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);
相关问题