当前位置: 首页 > 后端技术 > PHP

Laravel使用查询生成器QueryBuilder叠加链式调用的技巧

时间:2023-03-30 00:27:57 PHP

今天给大家介绍一个laravel查询生成器的小技巧。官方文档示例中没有详细提及,也不是什么高端技能。可能很多人在用,不知道的同学可以看看。在业务代码中,经常会根据不同的条件进行查询。举个简单的例子,我们现在要查询用户列表,按时间倒序排列,可能有状态和类型作为限制条件。一开始我写了if($status&&$type){$users=User::where('status',$status)->where('type',$type)->latest()->get();}elseif($status){$users=User::where('status',$status)->latest()->get();}elseif($type){$users=User::where('status',$type)->latest()->get();}else{$users=User::latest()->get();}这段代码真的很难看,很多公开的代码,比如->latest()->get(),写了四次,如果产品说我们今天要正序排列,那你得改四次地方。虽然借助编辑器改变它很快,但你要知道这只是最简单的例子。看了文档,有个when方法做条件判断,一堆闭包不是很理想。我坚信一定有更优雅的写法,于是在stackoverflow上搜索了一下,果然万能的歪果仁给了我答案。改进的写法:$query=User::query();//如果使用数据库:$query=DB::table('user');如果($status){$query->where('status',$status);}if($type){$query->where('type',$type);$users=$query->latest()->get();将querybuilder实例保存在一个变量中,然后对其叠加约束,最终得到集合。公共部分放在首尾,结构清晰。不是判断吗?并且我们也可以将$query作为参数传入方法或函数中,将公共逻辑封装在一起,方便多次调用:functionfoo($query){$query->with(['girl','gay'])->最新()->get();}$query=User::query();$users=foo($query);这种写法有一个注意点,一旦在$query方法上调用了where等约束,query就会发生变化,有时候我们需要提前clone一个query。例如,比如我们想同时获取类型1和类型2的用户$query_1=User::query();$query_2=克隆$query_1;$users_1=$query_1->where('type',1)->latest()->get();$users_2=$query_2->where('type',2)->latest()->get();//错误$users_2=$query_1->where('type',1)->latest()->get();//这个可以写成type=1and$type=2,虽然laravel文档中没有这样的例子,但是提到:可以使用DB门面表的方式来启动查询。该表方法返回查询表的查询构造函数实例,允许您在查询时链接更多约束,并使用get方法获取最终结果。感觉真的是在装哔哔,不是所有的搜索引擎,因为我那时候没用google。现在不想和只会百度的人一起工作了。百度就是广告搜索,搜索结果都是东西。Google和stackoverflow真是好东西。有很多歪果仁,知识丰富,解答专业,从计算机历史到操作系统,数据库,各种编程语言,帮我解决了很多bug。在segmentfault上这样打广告不好吗,滚!参考:HowtocreatemultiplewhereclausequeryusingLaravelEloquent?-stackoverflowModel::query-laravelAPI