[英]Converting mysql query to Laravel query builder
我第一次使用 Laravel。 我有(例如,为了使关系易于理解) books 、 authors 、 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: Roman
- 夏洛特卢卡斯 - 你完美的一年:小说 Kindle 版 Marc
- Garreau, Will Faurot - Redux 在行动
我的问题是如何使用 Laravel 查询生成器做同样的事情?
你可以这样
$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();
您在 laravel model class 中使用了hasOne
和hasMany
关系。
首先,您需要学习如何使用主键到外键的 laravel 中的连接 model。
如需更多信息,您需要参考此 URL 以加入 laravel 中的查询。
请查看下面的 URL 以获取连接查询
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.