查询标准是 CDbCriteria 的实例,它直接从 CComponent 派生,并且无子类,说明它具有相对独立性。从手册的解释看,查询标准意味着查询时的一些条件、排序、记录范围。CDbCriteria 属于包 system.db.schema,也表明它只为数据库服务,不在 system.db.ar下,说明它本身应该和 AR 没必然关系。
查询标准实例方法compare() -------- 作用:添加(追加)一个比较表达式到 condition属性
public CDbCriteria compare(string $column, mixed $value, boolean $partialMatch=false, string $operator='AND', boolean $escape=true)
$column 是被比较的列名
$value 是比较的值
$partialMatch指示是否使用模糊匹配,即 LIKE或NOT LIKE
$operator 可以 < 、>、<=、>=、<>、=,如果不是这些值,表示相等或部分相等(模糊匹配,子串匹配),同时可以用AND 或 OR 表明新的条件和已有条件的关系
$escape 表示是否使用转义,在使用模糊匹配时必须转义
查询标准的属性$condition -------------作用:相当于 WHERE 子句,用一个字符串指定
查询标准实例方法addCondition() ----------作用:追加一个条件到已经存在的条件中(默认是AND关系)
public CDbCriteria addCondition(mixed $condition, string $operator='AND')
另外有
public CDbCriteria addInCondition(string $column, array $values, string $operator='AND')
public CDbCriteria addNotInCondition(string $column, array $values, string $operator='AND')
基本上SELECT查询中的各个部分都有对应的属性或方法
前面讲述CGridView中的searchNotInGroup,存在无法正常使用筛选器的问题,因为没有加列比较的条件,我们通过细化查询标准,可以解决:
public function searchNotInGroup(Group $group)
{
$connection = Yii::app()->db;
$sql = 'select user_id from {{role}} except select user_id from {{role}} where '.
'group_id='.$group->id;
$command = $connection->createCommand($sql);
$rows = $command->queryAll();
$user_ids = array();
foreach($rows as $row) $user_ids[] = $row['user_id'];
$criteria = new CDbCriteria;
$criteria->compare('username', $this->username, true); //用户名模糊查询
$criteria->compare('status', $this->status);
$criteria->addInCondition('id', $user_ids);
$criteria->order = 'username';
return new CActiveDataProvider('User', array(
'criteria' => $criteria,
'pagination' => array(
'pageSize' => 3,
),
));
}