2

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

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

有没有办法添加一个静态 where 条件 " ... and username !='root' " ?

admin.php [查看]

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

user.php [模型]

    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,
    ));
}
4

2 回答 2

7

您可以像这样使用CDbCriteria 的 addCondition

 $criteria->addCondition("username !='root'");
于 2012-10-08T14:13:10.523 回答
6

您最好的选择是使用Yii 范围,它本质上是一个保存的 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() 查询。

于 2012-10-08T20:32:46.220 回答