1.概念
今天我们主要讲解连贯操作,可能什么是连贯操作呢?
参考链接:https://blog.youkuaiyun.com/heshihu2019/article/details/101024810?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-1&spm=1001.2101.3001.4242
以我们上一篇中编写的search为例吧。
public function search(){
//获取post的数据,根据数据组装查询的条件,根据条件从数据库中获取数据,返回给页面中遍历
//
if(isset($_POST['username']) && $_POST['username']!=null ){
$where['username']=array('like',"%{$_POST['username']}%");
}
if(isset($_POST['sex']) && $_POST['sex']!=null ){
$where['sex']=array('eq',$_POST['sex']);//等于传递来的参数
}
$m=M('User');
$arr=$m->where($where)->select();
$this->assign('data',$arr);
$this->display('index');//默认调用search模板,但是我们需要调用index模板,因此在display中我们需要添加参数index
}
我们首先在数组中将符合条件的$where['username']
和$where['sex']
进行匹配,然后在语句$m->where($where)->select()
中利用where条件进行select查询出来我们想要的结果。这where便属于连贯查询。
除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作的方法调用顺序没有先后,例如,如下两种代码其实是等效的:
$User->order('create_time')->limit(10)->where('status=1')->select();
$User->where('status=1')->order('create_time')->limit(10)->select();
连贯操作可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作,也是ThinkPHP的ORM(Object Relational Mapping,对象关系映射,模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术)中的一个亮点。使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 。
2.where连贯操作实例
接下来我们试着自己写一个连贯操作语句,例如:$m->where($where)->select()
首先我们现在thinkphp下面建立一个Model文件夹,然后新建一个Model.class.php文件
在文件中我们先试着自己先写一个select方法。类似于在select()方法中执行了一个select语句集。
class Model{
function __construct($tabName){
$this->tabName=$tabName;
mysql_connect('localhost','root','');//连接数据库
mysql_select_db('thinkphp');//选择库
}
function select(){
$arr=array();
$sql="select * from tp_user";
$result=mysql_query($sql);
if($result && mysql_num_rows($result)>0 ){
while($res = mysql_fetch_assoc($result)){
$arr[]=$res;
}
}
return $arr;
}
}
$m=new Model('User');
$arr=$m->select();//一=以数组的形式返回user表中的数据
var_dump($arr);
假如我们select * from tp_user
语句中的表名 tp_user 是后期拼接来的,那么我们的我们该怎么去写呢?
接下来,我们尝试着写入where方法,在此方法中传入一个条件,然后return $this
返回他本身。然后在进行select操作,即可查询出符合条件的语句。
访问:http://127.0.0.1/thinkphp/Model/model.calss.php
$m=M(‘User’),新建一个Model方法的实现
function M($tabName){
return new Model($tabName);
}
$m=M('User');//调用方法
3.常用连贯操作
以上操作均在Model.class.php文件的操作,接下里的为在/thinkphp/home/Lib/Action/User.calss.php文件中的操作。
以下操作在语句中无顺序之分,但是最后面一定是select、find、getFeild等语句,因为这几个不属于连贯操作方法。因此必须放在最后面。
-
1.where
帮助我们设置查询条件 -
2.order 对结果进行排序
数组形式
$arr=$m->order(array('id'=>desc,'sec'=>asc))->select();//id降序,sex升序
#等价于SELECT * FROM `tp_user` ORDER BY `id` desc,`sec` asc
非数组形式
$arr=$m->order('id desc')->select();//id降序排列
#等价于SELECT * FROM `tp_user` ORDER BY id desc
- 3.limit 限制结果
-
- limit(2,5)
-
- limit(‘2,5’)
-
- limit(10)//limit(0,10)
从第三条开始取出3条数据。
$arr=$m->order(array('id'=>desc,'sex'=>asc))->limit(3,3)->select();//id降序,sex升序
#等价于SELECT * FROM `tp_user` ORDER BY `id` desc,`sec` asc
访问:http://127.0.0.1/thinkphp/index.php/User/demo
- 4.field 设置查询字段
-
- field(‘username as name,id’)
-
- field(array(‘username’=>‘name’,‘id’)
-
- field(‘id’,true) //获取除了id以外的所有字段
以id升序,sex降序的排列方式,从第三条开始,取出三条数据的username和id字段,并且给username取一个别名为name。
$arr=$m->order(array('id'=>desc,'sex'=>asc))->field('username as name,id')->limit(3,3)->select();
数组形式:
$arr=$m->order(array('id'=>desc,'sex'=>asc))->field(array('username'=>'name,'id')->limit(3,3)->select();
访问:http://127.0.0.1/thinkphp/index.php/User/demo
- 5.table
- 6.group
- 7.having
4.补充
alias 用于给当前数据表定义别名 字符串
page 用于查询分页(内部会转换成limit) 字符串和数字
join* 用于对查询的join支持 字符串和数组
union* 用于对查询的union支持 字符串、数组和对象
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数(以后在缓存部分再详细描述)
relation 用于关联查询(需要关联模型扩展支持) 字符串
validate 用于数据自动验证 数组
auto 用于数据自动完成 数组
filter 用于数据过滤 字符串
scope* 用于命名范围 字符串、数组