ThinkPHP5 闭包查询问题的探讨
来源:互联网 发布:雅克比矩阵的应用 编辑:程序博客网 时间:2024/06/06 06:49
ThinkPHP5中,很多查询都用到了闭包函数构造查询器。
闭包,这个熟悉的陌生人,我们应该如何才能获得她的亲睐,最终抱得美人归呢?本教程或许可以让你找到答案!
按照官方手册中,对闭包作用的描述:数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯。
这句话,基本上说出了在查询中,使用闭包的环境和方法。
下面我们最常用的get()和find()方法为例,详细介绍一下闭包查询使用技巧。
准备工作:
我们操作的数据表模型是:staff(员工信息表),primary key 是 id
staff(id as 编号,name as 姓名,salary as 工资, dept as 部门);
一、get()方法
1、get()方法是模型类中定义一个方法,用于单条数据对象的输出。
2、实例:
(A)查询编号为1005的员工信息;
下面用数组构造查询器,将上面的代码重新改写:
3、如果仅仅是相等判断,数组优势并不明显,如果是更多的判断条件,数组优势就非常明显了。
(A)实例:查询工资大于等于3000元的开发部员工信息。
我们这里用的是get(),所以仅返回符合条件的第一条记录
可能大家发现了,随着查询条件变得复杂,我们的数组表达式变得非常的冗长,难以理解,并且书写困难,容易出现错误,排错也变得困难。
这时,闭包就上场了。
我们在学习PHP编程时,知道闭包函数,其本质是一个用变量来调用的函数,也就是匿名函数。
在这里,我们把所有的查询条件,不管有多复杂,全部打包到一个闭包函数中。
现在我们用闭包,将上面的代码改写:
(因为我们用get()方法演示,无法演示出分组、排序等查询效果,仅以限制字段显示进行演示,其它连贯操作思想是一样的)
find()方法是数据库类提供给我们的一个获取单条记录的方法,使用起来与get()非常类似
我们知道:模型是与数据表关联的,实例化以后,就会与指定的数据表绑定。
数据库则不同,必须手工指定数据表,最多可以省略前缀。
废话不多讲,直接上代码:
这里仅仅是为了代码清晰和可读性考虑。
经过测试,其运行结果与上面是完全一样的。
总结:
闭包查询是一个非常有意思的查询技巧,我们完全可以将非常复杂的查询要求,用这种方式,构造的查询器,非常清晰自然!
希望对正在学习查询构造器的您有所提示,特别是对闭包查询感到困惑的同学,希望多多练习,将上述代码亲自运行一遍!
闭包,这个熟悉的陌生人,我们应该如何才能获得她的亲睐,最终抱得美人归呢?本教程或许可以让你找到答案!
按照官方手册中,对闭包作用的描述:数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯。
这句话,基本上说出了在查询中,使用闭包的环境和方法。
下面我们最常用的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);
复制代码
这里说明一个,如果闭包函数中指定了数据表,上级调用是可以不指定的。这里仅仅是为了代码清晰和可读性考虑。
经过测试,其运行结果与上面是完全一样的。
总结:
闭包查询是一个非常有意思的查询技巧,我们完全可以将非常复杂的查询要求,用这种方式,构造的查询器,非常清晰自然!
希望对正在学习查询构造器的您有所提示,特别是对闭包查询感到困惑的同学,希望多多练习,将上述代码亲自运行一遍!
本教程由《理达课堂》提供!
http://www.thinkphp.cn/code/2466.html
阅读全文
0 0
- ThinkPHP5 闭包查询问题的探讨
- ThinkPHP5-简单的批量查询
- ThinkPHP5的重定向问题
- thinkphp5查询某一行多个字段的值
- 关于xmpp丢包的问题探讨聊天记录
- thinkphp5 model层的构造函数问题
- thinkphp,thinkphp5的唯一验证问题
- thinkphp5.0使用中遇见的问题
- thinkPHP5 session和cache的区别问题
- 安装ThinkPHP5.0.12遇到的小问题
- Thinkphp5 联合(关联)查询
- ThinkPHP5-缓存查询
- thinkPHP5 分页查询
- 递归问题的探讨
- 马赛克问题的探讨
- thinkphp5的nestedsets无限极分类扩展包使用
- thinkphp5,tpshop5下的数据库查询构造器的思考
- thinkphp5关联预加载数据的条件查询显示
- Java设计模式-迭代器模式
- JAVA不可修改类
- MVP
- 给文字加渐变色效果
- SQL Server 数据库导入导出数据
- ThinkPHP5 闭包查询问题的探讨
- mysql设置权限基本操作
- 字符串
- iOS各种调试技巧豪华套餐
- luogu1351 codevs3728 联合权值
- 用java代码根据html页面生成图片
- HDU 1495:非常可乐
- 编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出
- ubuntu16.04下载安装pcl点云库