要使用命名范围功能,主要涉及到模型类的_scope属性定义和scope连贯操作方法的使用。
_scope属性是一个数组,每个数组项表示定义一个命名范围,命名范围的定义格式为:
'命名范围标识名'=>array('属性1'=>'值1','属性2'=>'值2'...)
命名范围标识名:可以是任意的字符串,用于标识当前定义的命名范围。
命名范围支持的属性包括:
where 查询条件
、field 查询字段
、order 结果排序
、table 查询表名
、limit 结果限制
、page 结果分页
、having having查询
、group group查询
、lock 查询锁定
、distinct 唯一查询
、cache 查询缓存
// 在 Lib/Model/UserModel.class.php 里定义:
class UserModel extends CommonModel {
protected $_scope = array(
'jige' => array(
'where' => array(
'score' => array('egt', 60),
),
'order' => 'id asc',
'limit' => 10
),
'ziduan' => array(
'field' => 'nick_name, score',
'limit' => 5
),
);
}
// 在控制器里:
$user = D('User');
$data = $user->scope('jige')->select();
//得到的查询条件是:SELECT * FROM `mk_user` WHERE ( `score` >= 60 ) ORDER BY id asc LIMIT 10
如果两个字段里都有设置相同的limit
,后面一个会覆盖前面的
$data = $user->scope('jige,ziduan')->select();
//得到的查询条件是:SELECT `nick_name`,`score` FROM `mk_user` WHERE ( `score` >= 60 ) ORDER BY id asc LIMIT 5
使用命名范围的同时, 也可以使用 where 语句
$data = $user->scope('jige,ziduan')->where('id < 50')->select();
//得到的查询条件是:SELECT `nick_name`,`score` FROM `mk_user` WHERE ( `score` >= 60 ) AND ( id < 50 ) ORDER BY id asc LIMIT 5