要使用命名范围功能,主要涉及到模型类的_scope属性定义和scope连贯操作方法的使用。
首先定义_scope属性:
class NewsModel extends Model {
protected $_scope = array(
// 命名范围normal
'normal'=>array(
'where'=>array('status'=>1),
),
// 命名范围latest
'latest'=>array(
'order'=>'create_time DESC',
'limit'=>10,
),
);
}
_scope属性是一个数组,每个数组项表示定义一个命名范围,明明范围的定义格式为'命名范围标识'=>array(
'属性1'=>'值1',
'属性2'=>'值2',
...
)
命名范围标识:可以使任意的字符串,用于标识当前定义的命名范围名称。明明范围支持的属性包括:
where | 查询条件 |
field | 查询字段 |
order | 结果排序 |
table | 查询表名 |
limit | 结果限制 |
page | 结果分页 |
having | having查询 |
group | group查询 |
lock | 查询锁定 |
distinct | 唯一查询 |
cache | 查询缓存 |
方法调用
属性定义完成后,接下来就是使用scope方法进行命名范围的调用了,每调用一个命名范围,就相当于执行了命名范围内定义的相关操作选项对应的连贯操作方法。
调用单个命名范围
$Model = D('News'); // 这里必须使用D方法 因为命名范围在模型里面定义
$Model->scope('normal')->select();
$Model->scope('latest')->select();
生成的SQL语句分别是SELECT * FROM think_news WHERE status=1
SELECT * FROM think_news ORDER BY create_time DESC LIMIT 10
调用多个命名范围$Model->scope('normal')->scope('latest')->select();
或简化为$Model->scope('normal,latest')->select();
生成的SQL语句SELECT * FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 10
如果两个命名范围的定义存在冲突,则后面调用的命名范围会覆盖前面相同属性的定义如果调用的命名范围标识不存在,则会忽略该命名范围。
默认命名范围
protected $_scope = array(
// 默认的命名范围
'default'=>array(
'where'=>array('status'=>1),
'limit'=>10,
),
);
那么调用default命名范围可以直接使用:$Model->scope()->select();
命名范围调整如果需要在normal命名范围的基础上增加额外的调整,可以使用:
$Model->scope('normal',array('limit'=>5))->select();
生成的SQL语句是:SELECT * FROM think_news WHERE status=1 LIMIT 5
自定义命名范围$Model->scope(array('field'=>'id,title','limit'=>5,'where'=>'status=1','order'=>'create_time DESC'))->select();
生成的SQLSELECT id,title FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 5
与连贯操作混合使用protected $_scope = array(
'normal'=>array(
'where'=>array('status'=>1),
'field'=>'id,title',
'limit'=>10,
),
);
调用$Model->scope('normal')->limit(8)->order('id desc')->select();
生成SQLSELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 8
动态调用
$Model->scope('normal',array('limit'=>5))->select();
$Model->normal(array('limit'=>5))->select();