微学网

热门关键词:   as  thinkphp  ecshop  xxx  商务通  www.ymwears.cn
热门: ASP.NET PHP编程 ASP编程 JSP编程 Python

ThinkPHP5什么时候能用得上闭包查询

发布时间:2020-11-14 来源:未知 点击:
ThinkPHP5中,很多查询都用到了闭包函数构造查询器。
闭包,这个熟悉的陌生人,我们应该如何才能获得她的亲睐,最终抱得美人归呢?本教程或许可以让你找到答案!
按照官方手册中,对闭包作用的描述:数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯。
这句话,基本上说出了在查询中,使用闭包的环境和方法。
下面我们最常用的get()和find()方法为例,详细介绍一下闭包查询使用技巧。

准备工作:
我们操作的数据表模型是:staff(员工信息表),primary key 是 id
staff(id as 编号,name as 姓名,salary as 工资, dept as 部门);
一、get()方法
1、get()方法是模型类中定义一个方法,用于单条数据对象的输出。
2、实例:
(A)查询编号为1005的员工信息;
  1. dump(Staff::get(1005));
复制代码
分析以上代码,get()参数为条件,如果是主键可以直接写,如果不是主键呢?我们可以用数组来构造查询器来实现。
下面用数组构造查询器,将上面的代码重新改写:
  1. dump(Staff::get(['id'=>['=',1005]]));
复制代码
经过测试,运行结果是完全一样的。
3、如果仅仅是相等判断,数组优势并不明显,如果是更多的判断条件,数组优势就非常明显了。
(A)实例:查询工资大于等于3000元的开发部员工信息。
我们这里用的是get(),所以仅返回符合条件的第一条记录
  1. dump(Staff::get(['salary'=>['>=',3000],'dept'=>['=','开发部']])->getData());
复制代码
对应生成的SQL语句是:
  1. SELECT * FROM `tp5_staff` WHERE `salary` >= 3000 AND `dept` = '开发部' LIMIT 1
复制代码
当然我们想查看全部的信息,只需把get()换成all()方法,然后将getData()方法放在一个循环中调用每一个对象进行原始数据调用显示即可。

可能大家发现了,随着查询条件变得复杂,我们的数组表达式变得非常的冗长,难以理解,并且书写困难,容易出现错误,排错也变得困难。
这时,闭包就上场了。

我们在学习PHP编程时,知道闭包函数,其本质是一个用变量来调用的函数,也就是匿名函数。
在这里,我们把所有的查询条件,不管有多复杂,全部打包到一个闭包函数中。
现在我们用闭包,将上面的代码改写:
(因为我们用get()方法演示,无法演示出分组、排序等查询效果,仅以限制字段显示进行演示,其它连贯操作思想是一样的)
  1. //查询条件用闭包函数
  2. $data=Staff::get(function($query){//模型静态可以调用数据库类的方法
  3. $query = Staff::field(['name'=>'姓名','dept'=>'部门'])
  4.         ->where(['id'=>['=',1005]]);
  5.  })->getData();   //获取原始数据
  6.  
  7. //以二维数组方式输出
  8. dump($data);
复制代码
二、find()方法
find()方法是数据库类提供给我们的一个获取单条记录的方法,使用起来与get()非常类似
我们知道:模型是与数据表关联的,实例化以后,就会与指定的数据表绑定。
数据库则不同,必须手工指定数据表,最多可以省略前缀。
废话不多讲,直接上代码:
  1. //查询条件用闭包函数
  2. $data=Db::table('tp5_staff')->find(function($query){
  3. $query = Db::table('tp5_staff')->field(['name'=>'姓名','dept'=>'部门'])
  4.         ->where(['id'=>['=',1005]]);
  5.  });   
  6.  
  7. dump($data);
复制代码
这里说明一个,如果闭包函数中指定了数据表,上级调用是可以不指定的。
这里仅仅是为了代码清晰和可读性考虑。

经过测试,其运行结果与上面是完全一样的。
总结:
闭包查询是一个非常有意思的查询技巧,我们完全可以将非常复杂的查询要求,用这种方式,构造的查询器,非常清晰自然!
希望对正在学习查询构造器的您有所提示,特别是对闭包查询感到困惑的同学,希望多多练习,将上述代码亲自运行一遍!

这就是微学网-程序员之家为你提供的"ThinkPHP5什么时候能用得上闭包查询"希望对你有所帮助.本文来自网络,转载请注明出处:http://www.weixuecn.cn/article/14067.html
网络编程 | 前端制作 | 数据库 | CMS教程 | 脚本编程 | 框架 | 服务器 | 微信开发 | APP开发 | 学习教程 |

凡本网站转载的文章、图片等资料的版权归版权所有人所有,因无法和版权所有者一一联系,如果本网站选取的文/图威胁到您的权益,请您及时和本网站联系。 我们会在第一时间内采取措施,避免给双方造 成不必要的损失。
© 2015-2021 微学网 版权所有,并保留所有权利。 备案号:粤ICP备09051474号-1

菜鸟学习网,提供各类程序编程入门,技巧