我是第一次与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查询生成器来做同样的事情?
答案 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模型类中使用了hasOne
和hasMany
关系。
首先,您需要学习如何在laravel中使用主键为外键的联接模型。
有关更多信息,您需要引用此URL才能在laravel中加入查询。
请在下面的URL中查询加入查询
答案 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);