Laravel中替代::all()且返回Eloquent\Builder的方法
解决方案:使用
Model::query()获取Eloquent Builder实例 你要找的方法正是App\Entity\Post::query()——它和::all()的核心区别一目了然:
::all()会立即执行查询,直接返回Illuminate\Database\Eloquent\Collection实例::query()只会创建一个未执行的查询构建器,返回Illuminate\Database\Eloquent\Builder实例,完美适配你链式调用筛选条件的需求
具体用法示例
结合你提供的筛选解析函数,实际调用流程可以这样写:
// 1. 创建未执行的查询构建器(这一步替代::all(),保留链式操作能力) $baseQuery = App\Entity\Post::query(); // 2. 传入筛选器进行条件解析(链式添加自定义where规则) $filteredQuery = parse_filter($baseQuery, $yourFilterInstance); // 3. 最后执行查询,获取匹配条件的模型集合 $matchingPosts = $filteredQuery->get();
补充_parse_groups的实现思路
在你的分组解析函数里,可以利用闭包来处理嵌套的分组条件逻辑,比如实现AND/OR分组:
/** * @param \Illuminate\Database\Eloquent\Builder $query * @param array $groups * @return \Illuminate\Database\Eloquent\Builder */ function _parse_groups(\Illuminate\Database\Eloquent\Builder &$query, array $groups) { foreach ($groups as $group) { // 用闭包实现分组条件的嵌套 $query->where(function ($subQuery) use ($group) { foreach ($group['rules'] as $rule) { // 根据筛选规则的操作符,动态添加where条件 $subQuery->where($rule['column'], $rule['operator'], $rule['value']); // 如果是OR类型的规则,替换成$subQuery->orWhere(...)即可 } }); } return $query; }
额外小提示
- 所有链式调用的条件都会暂存在构建器中,直到你调用
get()、first()、paginate()等方法时,才会真正执行SQL查询 - 如果需要从
DB::table()的查询构建器转换,也可以用App\Entity\Post::fromQuery($dbBuilder->toSql(), $dbBuilder->getBindings()),但大部分场景下直接用Model::query()更简洁
内容的提问来源于stack exchange,提问作者Ivan T.
相关产品推荐
相关产品推荐

