【问题标题】:Yii CGridView: how to add a static WHERE condtion?Yii GridView:如何添加静态 WHERE 条件?
【发布时间】:2012-09-28 18:01:15
【问题描述】:

我有一个标准的 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,
    ));
}

【问题讨论】:

    标签: php yii conditional-statements where


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您最好的选择是使用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() 查询。

      【讨论】:

      • 这听起来不错,但我的实际理解还差很多
      • 刚刚更新了我的答案,提供了有关范围的更多详细信息。你真的应该试一试,他们会为你节省很多工作:-)
      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2019-10-07
      • 2011-04-25
      相关资源
      最近更新 更多