Thinkphp的艺术之连贯操作_04

本文详细介绍了ThinkPHP框架中的连贯操作,通过实例展示了如何使用where、order和limit等方法进行数据查询。连贯操作能提升代码的可读性和开发效率,支持所有CURD操作。文章还提供了自定义Model文件中实现连贯操作的示例,以及在实际应用中的常用方法,如设置查询条件、排序、限制结果和选择字段等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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* 用于命名范围 字符串、数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值