ThinkPHP3.2.3中系统支持默认命名范围功能,如果你定义了一个default命名范围,例如:
protected $_scope = array( // 默认的命名范围 'default'=>array( 'where'=>array('status'=>1), 'limit'=>10, ), );
那么调用default命名范围可以直接使用:
$Model->scope()->select();
而无需再传入命名范围标识名
$Model->scope('default')->select();
虽然这两种方式是等效的。
命名范围调整
如果你需要在normal命名范围的基础上增加额外的调整,可以使用:
$Model->scope('normal',array('limit'=>5))->select();
生成的SQL语句是:
SELECT * FROM think_news WHERE status=1 LIMIT 5
当然,也可以在两个命名范围的基础上进行调整,例如:
$Model->scope('normal,latest',array('limit'=>5))->select();
生成的SQL是:
SELECT * FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 5
自定义命名范围
又或者,干脆不用任何现有的命名范围,我直接传入一个命名范围:
$Model->scope(array('field'=>'id,title','limit'=>5,'where'=>'status=1','order'=>'create_time DESC'))->select();
这样,生成的SQL变成:
SELECT id,title FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 5
与连贯操作混合使用
命名范围一样可以和之前的连贯操作混合使用,例如定义了命名范围_scope属性:
protected $_scope = array( 'normal'=>array( 'where'=>array('status'=>1), 'field'=>'id,title', 'limit'=>10, ), );
然后在使用的时候,可以这样调用:
$Model->scope('normal')->limit(8)->order('id desc')->select();
这样,生成的SQL变成:
SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 8
如果定义的命名范围和连贯操作的属性有冲突,则后面调用的会覆盖前面的。
如果是这样调用:
$Model->limit(8)->scope('normal')->order('id desc')->select();
生成的SQL则是:
SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 10
动态调用
除了采用scope方法调用命名范围外,我们还支持直接调用命名范围名称的方式来动态调用,例如:
$Model->scope('normal',array('limit'=>5))->select();
查询操作也可以采用:
$Model->normal(array('limit'=>5))->select();
的方式调用。 normal(array('limit'=>5))
表示调用normal命名范围,并且传入额外的array('limit'=>5)
参数。
由于采用的是__call
魔术方法机制,因此这样调用的前提是你定义的命名范围名称没有和现有操作方法冲突。