Yii CGridView:如何添加静态WHERE条件?

时间:2012-10-08 13:14:17

标签: php yii conditional-statements where

我有一个标准的Gii创建的管理视图,它使用CGridView,它显示我的用户表数据。

问题是名称为“root”的用户必须不可见。

有没有办法在条件“...和用户名!='root'”中添加静态?

admin.php [查看]

'columns'=>array(
    'id',
    'username',
    'password',
    'realname',
    'email',
            .....

user.php [model]

    public function search()
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('username',$this->username,true);
    $criteria->compare('password',$this->password,true);
    $criteria->compare('realname',$this->realname,true);
    $criteria->compare('email',$this->email,true);

    ......


    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

2 个答案:

答案 0 :(得分:7)

您可以像这样使用CDbCriteria's addCondition

 $criteria->addCondition("username !='root'");

答案 1 :(得分:6)

您最好的选择是使用Yii scopes,它基本上是一个保存的where子句(或现有标准的其他修改),您可以在整个应用中应用,只需要在一个地方更改,如果您的标准最后会改变。

使它们更酷的原因是你可以将它们与其他范围/标准变化(例如来自网格中的用户)一起串起来,而不必跟踪哪些标准条款被更改所改变。

可能适用于您的情况的一些示例。在你的控制器中你可能有这样的东西:

$users = User::model()->search()->findAll();

Asgaroth的答案回答了你在表面上提出的要求。但是你可以使用范围做更多的事情(并且很容易)。

如果您将以下内容添加到您的用户模型中:

class User extends CActiveRecord
{
    ......
    public function scopes()
    {
        return array(
            'active'=>array(
                'condition'=>'active=1',
            ),
            'isAdmin'=>array(
                'condition'=>'isAdmin=1',
            ),
        );
    }
}

然后您可以在控制器中检索活动用户(仍然应用用户的过滤器):

$users = User::model()->active()->search()->findAll();

或者您可以检索所有活动的管理员用户(不会按照您的gridview标准进行过滤),如下所示:

$users = User::model()->active()->isAdmin()->findAll();

默认范围只是同一想法的扩展:

class User extends CActiveRecord
{
    public function defaultScope()
    {
        return array(
            'condition'=>"username != 'root'",
        );
    }
}

如果在您的isAdmin范围之前返回root用户,则应用默认范围将从返回的模型中删除root用户,因为它适用于您所做的每个User :: model()查询。