Laravel Query Builder 完全指南:5分钟学会API驱动的Eloquent查询构建

张开发
2026/4/16 1:31:47 15 分钟阅读

分享文章

Laravel Query Builder 完全指南:5分钟学会API驱动的Eloquent查询构建
Laravel Query Builder 完全指南5分钟学会API驱动的Eloquent查询构建【免费下载链接】laravel-query-builderEasily build Eloquent queries from API requests项目地址: https://gitcode.com/gh_mirrors/la/laravel-query-builderLaravel Query Builder是一个强大的工具让开发者能够轻松地从API请求构建Eloquent查询实现过滤、排序和关系包含等功能。无论是构建复杂的API端点还是简化数据查询逻辑它都能显著提升开发效率让你的Laravel应用更加灵活和强大。为什么选择Laravel Query Builder在现代API开发中前端常常需要根据不同条件动态筛选、排序和加载数据。传统的做法需要手动解析查询参数并构建查询语句不仅繁琐且容易出错。而Laravel Query Builder提供了一种优雅的解决方案让你可以通过简洁的API配置自动处理前端传来的查询参数快速构建出符合需求的数据库查询。核心优势减少重复代码无需手动解析查询参数几行代码即可实现复杂的查询逻辑提高API灵活性前端可以通过查询参数自由组合过滤条件无需后端频繁修改增强代码可读性直观的方法链让查询构建过程清晰易懂内置安全机制只允许预定义的过滤、排序和包含关系防止恶意查询快速开始安装与基础配置安装步骤通过Composer安装Laravel Query Buildercomposer require spatie/laravel-query-builder发布配置文件可选php artisan vendor:publish --providerSpatie\QueryBuilder\QueryBuilderServiceProvider --tagconfig配置文件将保存在config/query-builder.php你可以在这里自定义查询参数名称、分隔符等设置。基本用法示例下面是一个简单的示例展示如何在控制器中使用Query Builderuse Spatie\QueryBuilder\QueryBuilder; use App\Models\User; class UsersController extends Controller { public function index() { $users QueryBuilder::for(User::class) -allowedFilters([name, email]) -allowedSorts([name, created_at]) -allowedIncludes([posts, comments]) -paginate(); return response()-json($users); } }现在你可以通过API请求中的查询参数来过滤、排序和包含关系GET /users?filter[name]Johnsort-created_atincludeposts这个请求将返回名字包含John的用户按创建时间降序排列并包含他们的帖子数据。核心功能详解1. 过滤数据FilteringQuery Builder提供了多种过滤方式满足不同的查询需求基本过滤QueryBuilder::for(User::class) -allowedFilters([ name, // 默认为部分匹配LIKE %value% AllowedFilter::exact(email), // 精确匹配 AllowedFilter::beginsWith(username), // 以...开头 AllowedFilter::endsWith(domain), // 以...结尾 ]);前端请求示例GET /users?filter[name]Johnfilter[email]johnexample.com范围过滤使用模型中的作用域进行过滤QueryBuilder::for(User::class) -allowedFilters([ AllowedFilter::scope(active), // 调用scopeActive()方法 AllowedFilter::scope(age, age_between), // 自定义作用域名 ]);在模型中定义作用域class User extends Model { public function scopeActive($query) { return $query-where(active, true); } public function scopeAgeBetween($query, $min, $max) { return $query-whereBetween(age, [$min, $max]); } }前端请求示例GET /users?filter[active]filter[age]18,30关系过滤通过点符号过滤关联模型的属性QueryBuilder::for(User::class) -allowedFilters([ AllowedFilter::partial(posts.title), // 过滤用户帖子标题 ]);前端请求示例GET /users?filter[posts.title]Laravel2. 排序数据Sorting轻松实现数据排序功能QueryBuilder::for(User::class) -allowedSorts([ name, // 按名称升序 AllowedSort::field(registered, created_at), // 自定义排序字段名 AllowedSort::callback(random, function ($query, $direction) { $query-inRandomOrder(); }), // 自定义排序逻辑 ]) -defaultSort(name); // 默认排序前端请求示例GET /users?sort-created_at,name // 按created_at降序name升序3. 包含关系Including Relationships简化关联数据的加载QueryBuilder::for(User::class) -allowedIncludes([ posts, // 包含帖子 posts.comments, // 包含帖子的评论嵌套关系 AllowedInclude::count(postsCount), // 只包含帖子数量 AllowedInclude::exists(hasPosts), // 只包含是否有帖子的布尔值 ]);前端请求示例GET /users?includeposts,postsCount4. 字段选择Field Selection允许前端指定需要返回的字段减少不必要的数据传输QueryBuilder::for(User::class) -allowedFields([ id, name, email, // 用户表字段 posts.id, posts.title // 关联表字段 ]) -allowedIncludes([posts]);前端请求示例GET /users?fields[users]id,namefields[posts]id,titleincludeposts高级功能自定义过滤器创建自定义过滤器来处理复杂的过滤逻辑use Spatie\QueryBuilder\Filters\Filter; use Illuminate\Database\Eloquent\Builder; class FiltersByRole implements Filter { public function __invoke(Builder $query, $value, string $property) { $query-whereHas(roles, function ($q) use ($value) { $q-where(name, $value); }); } } // 在查询中使用 QueryBuilder::for(User::class) -allowedFilters([ AllowedFilter::custom(role, new FiltersByRole()), ]);聚合包含包含关联模型的聚合数据QueryBuilder::for(User::class) -allowedIncludes([ AllowedInclude::sum(postsViews, posts, views), // 帖子总浏览量 AllowedInclude::avg(postsRating, posts, rating), // 帖子平均评分 AllowedInclude::max(latestPostDate, posts, created_at), // 最新帖子日期 ]);前端请求示例GET /users?includepostsViews,postsRating最佳实践与常见问题性能优化避免N1查询始终使用allowedIncludes()来预加载关联关系合理使用字段选择通过allowedFields()限制返回字段减少数据传输分页处理使用paginate()或simplePaginate()处理大量数据安全注意事项明确允许参数始终显式列出允许的过滤器、排序和包含关系避免安全风险处理敏感字段不要允许过滤或返回敏感信息字段验证输入在自定义过滤器中添加输入验证逻辑常见问题解决问题查询参数未生效解决确保已在allowedFilters()、allowedSorts()或allowedIncludes()中添加了相应参数问题关联过滤不工作解决检查关联关系是否定义正确并确保使用了正确的点符号语法问题出现未允许的过滤器异常解决将该过滤器添加到allowedFilters()列表中或在配置文件中禁用严格模式总结Laravel Query Builder是构建灵活API的强大工具它通过简洁的API让你轻松实现过滤、排序和关联包含等功能。无论是小型项目还是大型应用它都能帮助你编写更简洁、更可维护的代码提升开发效率。通过本文的介绍你已经掌握了Laravel Query Builder的基本用法和高级特性。现在是时候在你的项目中尝试使用它体验API开发的新方式了想要了解更多细节可以查看项目中的官方文档docs/ 和源代码src/。【免费下载链接】laravel-query-builderEasily build Eloquent queries from API requests项目地址: https://gitcode.com/gh_mirrors/la/laravel-query-builder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章