ThinkPhp 3.2 数据的连贯操作
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。
使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:
$User->where('status=1')->order('create_time')->limit(10)->select();
这里的where
、order
和limit
方法就被称之为连贯操作方法,除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作的方法调用顺序没有先后。
常用操作:
//造模型对象
$nation = D("Nation"); //查询
//$a = $nation->select(); //查所有,返回关联数组
//$a = $nation->select("n001,n002,n003"); //通过主键查
//$a = $nation->find("n002"); //查一条数据
//$a = $nation->table("Info")->select(); //切换表
//$a = $nation->field("name")->select(); //查询指定字段 另:
//$sql = "update nation set name='矮人族' where code='n001'";
//$a = $nation->query($sql); //执行查询
//$a = $nation->execute($sql); //执行其他操作
ALIAS操作:
alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。
$Model = M('User');
$Model->alias('a')->join('__DEPT__ b ON b.user_id= a.id')->select();
最终生成的sql语句类似于:
SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id= a.id
$a = $nation->alias('a')->field("b.Code as 'code',b.Name as 'name',a.name as '民族'")->join("Info b on a.Code=b.Nation")->select();
ORDER操作:
$a = $nation->order("code desc")->select(); //排序
支持对多个字段的排序,例如:
$Model->where('status=1')->order('id desc,status')->limit(5)->select();
如果没有指定desc或者asc排序规则的话,默认为asc。
如果你的字段和mysql关键字有冲突,那么建议采用数组方式调用,例如:
$Model->where('status=1')->order(array('order','id'=>'desc'))->limit(5)->select();
LIMIT操作和PAGE操作:
$a = $nation->limit(3,3)->select(); //分页
$a = $nation->page(3,3)->select(); //分页
限制结果数量:
例如获取满足要求的10个用户,如下调用即可:
$User = M('User');
$User->where('status=1')->field('id,name')->limit(10)->select();
limit方法也可以用于写操作,例如更新满足要求的3条数据:
$User = M('User');
$User->where('score=100')->limit(3)->save(array('level'=>'A'));
page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法。
如果使用limit方法,我们要查询第一页和第二页(假设我们每页输出10条数据)写法如下:
$Article = M('Article');
$Article->limit('0,10')->select(); // 查询第一页数据
$Article->limit('10,10')->select(); // 查询第二页数据
如果用page方法来写则简单多了,例如:
$Article = M('Article');
$Article->page(1,10)->select(); // 查询第一页数据
$Article->page(2,10)->select(); // 查询第二页数据
显而易见的是,使用page方法你不需要计算每个分页数据的起始位置,page方法内部会自动计算。
page方法还可以和limit方法配合使用,例如:
$Article->limit(25)->page(3)->select();
GROUP操作和HAVING操作:
$a = $nation->table("Car")->field("Brand,avg(Price)")->group("Brand")->select(); //分组
$a = $nation->table("Car")->field("Brand,avg(Price)")->group("Brand")->having("avg(Price)>50")->select();
group方法只有一个参数,并且只能使用字符串。
也支持对多个字段进行分组,例如:
$this->field('username,max(score)')->group('user_id,test_time')->select();
生成的SQL语句是:
SELECT username,max(score) FROM think_score GROUP BY user_id,test_time
DISTINCT方法:
DISTINCT 方法用于返回唯一不同的值 。
例如:
$Model->distinct(true)->field('name')->select();
生成的SQL语句是: SELECT DISTINCT name FROM think_user
distinct方法的参数是一个布尔值.
JOIN方法:
JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。
- INNER JOIN: 如果表中有至少一个匹配,则返回行,等同于 JOIN
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
join方法支持多次调用,但指定的数据表必须是全称,但我们可以这样来定义:
$Model
->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id')
->join('__CARD__ ON __ARTIST__.card_id = __CARD__.id')
->select();
__WORK__
和 __CARD__
在最终解析的时候会转换为 think_work
和 think_card
。
默认采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成
$Model->join('RIGHT JOIN __WORK__ ON __ARTIST__.id = __WORK__.artist_id')->select()
或者使用:
$Model->join('__WORK__ ON __artist__.id = __WORK__.artist_id','RIGHT')->select()
UNION方法:
UNION操作用于合并两个或多个 SELECT 语句的结果集。
$Model->field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('SELECT name FROM think_user_2')
->select();
数组用法:
$Model->field('name')
->table('think_user_0')
->union(array('field'=>'name','table'=>'think_user_1'))
->union(array('field'=>'name','table'=>'think_user_2'))
->select();
或者:
$Model->field('name')
->table('think_user_0')
->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2'))
->select();
注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
COMMENT方法:
COMMENT方法 用于在生成的SQL语句中添加注释内容,例如:
$this->comment('查询考试前十名分数')
->field('username,score')
->limit(10)
->order('score desc')
->select();
最终生成的SQL语句是:
SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查询考试前十名分数 */
DATA方法:
data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值。
写操作:
通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如:
$Model = D('User');
$Model->create();
// 这里略过具体的自动生成和验证判断
$Model->add();
又或者直接对对象赋值,例如:
$Model = M('User');
$Model->name = '流年';
$Model->email = 'thinkphp@qq.com';
$Model->add();
那么data方法则是直接生成要操作的数据对象,例如:
$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->data($data)->add();
注意:如果我们同时使用create方法和data创建数据对象的话,则最后调用的方法有效。
data方法支持数组、对象和字符串,对象方式如下:
$Model = M('User');
$obj = new \stdClass;
$obj->name = '流年';
$obj->email = 'thinkphp@qq.com';
$Model->data($obj)->add();
字符串方式用法如下:
$Model = M('User');
$data = 'name=流年&email=thinkphp@qq.com';
$Model->data($data)->add();
也可以直接在add方法中传入数据对象来新增数据,例如:
$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->add($data);
但是这种方式data参数只能使用数组。
当然data方法也可以用于更新数据,例如:
$Model = M('User');
$data['id'] = 8;
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->data($data)->save();
当然我们也可以直接这样用:
$Model = M('User');
$data['id'] = 8;
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->save($data);
同样,此时data参数只能传入数组。
在调用save方法更新数据的时候 会自动判断当前的数据对象里面是否有主键值存在,如果有的话会自动作为更新条件。也就是说,下面的用法和上面等效:
$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$Model->data($data)->where('id=8')->save();
读操作:
除了写操作外,data方法还可以用于读取当前的数据对象,例如:
$User = M('User');
$map['name'] = '流年';
$User->where($map)->find();
// 读取当前数据对象
$data = $User->data();
ThinkPhp 3.2 数据的连贯操作的更多相关文章
- thinkphp 3.2 部分数据库连贯操作phpstorm helper 文件
<?php class Helper { /** * 用于设置数据写入和查询是否严格检查是否存在字段. * 默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常 * 如: * str ...
- ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)
1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...
- ThinkPHP - 连贯操作
/** * 连贯操作 * @return 无返回值 */ public function coherentOperation(){ //实例化模型 $user = M('User'); // +--- ...
- 11.ThinkPHP 3.1.2 连贯操作
==================================================== 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $ar ...
- ThinkPHP框架模型连贯操作(八)
原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...
- ThinkPHP模型基础类提供的连贯操作方法
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 直线电机哪家好 使用也比较简单, 假如我们现在要查 ...
- thinkPHP--SQL连贯操作
一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位. //连贯操作入门 $user = M('User'); var_dump($user-& ...
- 【转】PHP实现连贯操作
[第一种方案 __call] 我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码. M('User')->where(array('id'=>1))->field( ...
- MySQL数据库操作类(PHP实现,支持连贯操作)
<?php /** * Author: suvan * CreateTime: 2018/2/27 * description: 数据库操作类(仅对接MySQL数据库,主要利用MySQLi函数) ...
随机推荐
- Android简单介绍SharedPreference,内部文件,sdcard数据存储
SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- iOS获取网络图片大小
在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想 ...
- 01背包问题python 2.7实现
版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html #!/usr/bin/env python # -*- coding ...
- Thread Object wait() notify()基本
package com.thread.test.thread; import java.util.ArrayDeque; import java.util.Queue; import java.uti ...
- loadrunner性能测试---添加windows多台压力机
添加多台压力机 1.前置条件 1)保证压力机上都安装了loadrunner Agent,并启动,状态栏中会有小卫星. 2)添加的压力机与controller所在机器是否在同一个网段,建议关 ...
- AD域撤销域用户管理员权限方案
一.简介 公司大部分主机加入域已有一段时间了,由于某软件没管理员权限不能执行,所以管理员权限一直没撤销,不能完全实现域的管理效果.但起码实现了域用户脱离不了域的控制:http://www.cnblog ...
- Eclipse注释模板设置详解
设置注释模板的入口:Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素 ...
- Spring 框架的架包分析、功能作用、优点,及jar架包简介
Spring 框架的架包详解 Spring的作用 Spring的优势 由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...
- 4种解决json日期格式问题的办法
4种解决json日期格式问题的办法 开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下 ...