您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
thinkphp3.2.1学习笔记-SQL连贯操作[下]
发布时间:2017-09-19 11:10:25编辑:雪饮阅读()
连贯操作设置表别名:
$list=$user->alias("a")->select();
连贯操作实现分组统计并对每组数据再次进行统计:
$list=$user->field("name,SUM(id)")->group("id")->having("id>2")->select();
having主要作用于group后,having实例解析:
显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据.
连贯操作sql注释:
仅仅只是在页面调试的控制台中有效果
$list=$user->comment("所有用户")->select();
连贯操作实现join:
$list=$user->join('think_info ON think_info.id=think_user.id')->select();
也可以通过参数控制join方向:
$list=$user->join('think_info ON think_info.id=think_user.id','RIGHT')->select();
简化版:
$list=$user->join('__INFO__ ON __INFO__.id=__USER__.id','RIGHT')->select();
连贯操作实现结果集合并:
要求合并的数据表的字段数一致
$list=$user->union('select * from __INFO__')->select();
连贯操作实现不重复的列:
如果有多条数据的name字段值相同,则仅显示一条
$list=$user->field('name')->distinct(true)->select();
连贯操作查询缓存(数据缓存而不是像前面那样的仅仅字段缓存):
第二次操作读取缓存
$list=$user->cache(true)->select();
连贯操作-编码规范:
传统的面向过程式的编码流程并不能为所有人认为可读性好,有些人认为封装的可读性比较好。
封装sql到自定义模型:
<?php
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
protected $_scope=array(
'sql1'=>array(
//字符串也可以'where'=>array('id=1'),
'where'=>array('id'=>1),
),
'sql2'=>array(
'order'=>array('id'=>'DESC'),
'limit'=>2,
),
'default'=>array(
'where'=>array('id'=>1),
), );
}
?>
使用该封装模型:
$user=D("User");
$list=$user->scope()->select();
由于scope中有default数组,所以这里默认不传递参数就是default的条件。如果没有default,则直接查询整个数据表。
上面示例中封装模型中的属性名将会被调用时当做方法名使用。
封装模型中的sql1和sql2这种键名被当做参数来传递:
$list=$user->scope('sql1')->select();
该封装模型还支持多次连贯操作调用:
$list=$user->scope('sql1')->scope('sql2')->select();
调用时第二个参数可以对sql条件进行临时的调整:
$list=$user->scope('sql2',array('limit'=>4))->select();
也可以调用时完全无视原来的条件,直接覆盖原来的条件:
$list=$user->scope(array('where'=>array('id'=>1),'order'=>'id DESC','limit'=>2))->select();
还可以直接使用命名范围进行调用:
$list=$user->sql2()->select();
关键字词:thinkphp3.2.1,sql,连贯操作