ThinkPHP5 闭包查询问题的探讨

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. 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. dump($data);
复制代码
这里说明一个,如果闭包函数中指定了数据表,上级调用是可以不指定的。
这里仅仅是为了代码清晰和可读性考虑。

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

本教程由《理达课堂》提供!


http://www.thinkphp.cn/code/2466.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值