首页 > 编程 > PHP > 正文

laravel技巧之查询构造器Query Builder叠加链式调用方法的讲解

2020-03-22 17:07:25
字体:
来源:转载
供稿:网友
首页 > html' target='_blank'>php教程 > php教程 > 正文 laravel技巧之查询构造器Query Builder叠加链式调用方法的讲解 2018-07-06 17:36:18 第六期线上培训班
这篇文章主要给大家介绍了关于laravel技巧之查询构造器Query Builder叠加链式调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。

查询构造器简介

Laravel查询构造器(query builder)提供方便、流畅的接口,用来建立及执行数据库查找语法

使用PDO参数绑定,以保护应用程序免于SQL注入。因此传入的参数不需额外转义特殊字符

基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行

引言

今天给大家介绍一下laravel查询构造器的一个小技巧,在官方文档示例中没有详细提到,也不是啥高端技巧,可能很多人在用了,不知道的同学可以看看。

在业务代码中经常会根据不同条件来查询,举个简单例子,我们现在要查询用户列表,按时间倒序排列,可能会有status和type作为限定条件。

一开始我是这样写的

 if($status $type) { $users = User::where( status , $status)- where( type , $type)- latest()- get(); } else if ($status) { $users = User::where( status , $status)- latest()- get();  } else if ($type) { $users = User::where( status , $type)- latest()- get(); } else { $users = User::latest()- get();  }

这个代码真的很丑陋,很多公共代码,比如- latest()- get(),写了四遍,如果产品说今天我们要正序排列,那你得改四个地方。虽然借助编辑器改一下也很快,不过要知道这只是个最简单的例子。

看了下文档有个when方法进行条件判断,一堆闭包也不是很理想。我坚信肯定有更优雅的写法,于是上stackoverflow搜了一波,果然万能的歪果仁给了我答案。

改进后的写法:

 $query = User::query(); // 如果用DB: $query = DB::table( user  if ($status) { $query- where( status , $status); if ($type) { $query- where( type , $type); $users = $query- latest()- get();

用变量保存查询构造器实例,然后在其上叠加约束条件,最后get集合。公共部分放在首尾,结构清晰,是不是高下立判啊?

而且我们还可以把$query当成参数传入方法或函数中,将公共逻辑封装在一起,方便多处调用:

 function foo($query) { $query- with([ girl , gay ]) - latest() - get(); $query = User::query(); $users = foo($query);

这种写法有一个注意事项,一旦你在$query上调用where等约束方法,就会改变此query,有时候我们需要提前clone一个query。

举例说明,比如我们同时要拿到type为1和2的users

 $query_1 = User::query(); $query_2 = clone $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 = 1 and $type = 2

laravel的文档里虽然没有写这种示例,但是提了一下:

你可以使用 DB facade 的 table 方法开始查询。这个 table 方法针对查询表返回一个查询构造器实例,允许你在查询时链式调用更多约束,并使用 get 方法获取最终结果

题外话

以前听一些老前辈说他们不要只会百度的程序员,当时感觉真装哔,不都是搜索引擎,因为我那时不用google。现在我也不愿意和只会百度的共事了,百度只是个广告搜索嘛,搜出来的都是些啥玩意。

google、stackoverflow真是个好东西,很多歪果仁知识丰富,解答专业,从计算机历史到操作系统、数据库、各种编程语言,帮我de了好多bug。在segmentfault这么打广告是不是不好,溜了!

总结

Reference:

How to create multiple where clause query using Laravel Eloquent? - stackoverflow

Model::query - laravelAPI

您可能感兴趣的文章:

php实现斐波那契数列代码的分享

PHP基于二分法实现数组查找功能示例讲解

详解php中的类与对象

以上就是laravel技巧之查询构造器Query Builder叠加链式调用方法的讲解的详细内容,PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表