PHP

ThinkPHP5 闭包查询问题的探讨

字号+ 编辑: 国内TP粉 修订: 种花家 来源: 理达课堂 2023-09-11 我要说两句(0)

闭包,这个熟悉的陌生人,我们应该如何才能获得她的亲睐,最终抱得美人归呢?本教程或许可以让你找到答案!

ThinkPHP5中,很多查询都用到了闭包函数构造查询器。

按照官方手册中,对闭包作用的描述:数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯。

这句话,基本上说出了在查询中,使用闭包的环境和方法。

下面我们最常用的get()和find()方法为例,详细介绍一下闭包查询使用技巧。

准备工作:

我们操作的数据表模型是:staff(员工信息表),primary key 是 id

staff(id as 编号,name as 姓名,salary as 工资, dept as 部门);

一、get()方法

1、get()方法是模型类中定义一个方法,用于单条数据对象的输出。

2、实例:

(A)查询编号为1005的员工信息;dump(Staff::get(1005));分析以上代码,get()参数为条件,如果是主键可以直接写,如果不是主键呢?我们可以用数组来构造查询器来实现。

下面用数组构造查询器,将上面的代码重新改写:dump(Staff::get(['id'=>['=',1005]]));经过测试,运行结果是完全一样的。

3、如果仅仅是相等判断,数组优势并不明显,如果是更多的判断条件,数组优势就非常明显了。

(A)实例:查询工资大于等于3000元的开发部员工信息。

我们这里用的是get(),所以仅返回符合条件的第一条记录dump(Staff::get(['salary'=>['>=',3000],'dept'=>['=','开发部']])->getData());对应生成的SQL语句是:SELECT * FROM `tp5_staff` WHERE `salary` >= 3000 AND `dept` = '开发部' LIMIT 1当然我们想查看全部的信息,只需把get()换成all()方法,然后将getData()方法放在一个循环中调用每一个对象进行原始数据调用显示即可。

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

这时,闭包就上场了。

我们在学习PHP编程时,知道闭包函数,其本质是一个用变量来调用的函数,也就是匿名函数。

在这里,我们把所有的查询条件,不管有多复杂,全部打包到一个闭包函数中。

现在我们用闭包,将上面的代码改写:

(因为我们用get()方法演示,无法演示出分组、排序等查询效果,仅以限制字段显示进行演示,其它连贯操作思想是一样的)//查询条件用闭包函数

$data=Staff::get(function($query){//模型静态可以调用数据库类的方法

$query = Staff::field(['name'=>'姓名','dept'=>'部门'])

        ->where(['id'=>['=',1005]]);

 })->getData();   //获取原始数据

// 以二维数组方式输出

dump($data);

二、find()方法

find()方法是数据库类提供给我们的一个获取单条记录的方法,使用起来与get()非常类似

我们知道:模型是与数据表关联的,实例化以后,就会与指定的数据表绑定。

数据库则不同,必须手工指定数据表,最多可以省略前缀。

废话不多讲,直接上代码://查询条件用闭包函数

$data=Db::table('tp5_staff')->find(function($query){
$query = Db::table('tp5_staff')->field(['name'=>'姓名','dept'=>'部门'])
        ->where(['id'=>['=',1005]]);
 });
dump($data);

这里说明一个,如果闭包函数中指定了数据表,上级调用是可以不指定的。

这里仅仅是为了代码清晰和可读性考虑。

经过测试,其运行结果与上面是完全一样的。

总结

闭包查询是一个非常有意思的查询技巧,我们完全可以将非常复杂的查询要求,用这种方式,构造的查询器,非常清晰自然!

希望对正在学习查询构造器的您有所提示,特别是对闭包查询感到困惑的同学,希望多多练习,将上述代码亲自运行一遍!

阅完此文,您的感想如何?
  • 有用

    1

  • 没用

    1

  • 开心

    1

  • 愤怒

    1

  • 可怜

    1

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • mac开发接入微信公众号接口返回报错 cURL error 56: SSLRead() return error -9806

  • pecl安装程序时报错Array and string offset access syntax with curly braces is no longer supported

  • PHP的换行符是什么

  • 由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决

我要说说
网上宾友点评