如果我们使用`$ criteria-> condition`和/或`$ criteria-> params`,为什么CGridView无法过滤?

时间:2014-07-02 21:17:06

标签: yii

我有以下内容:

public function search() {
        $criteria = new CDbCriteria();

        $criteria->compare('id',$this->id);
        $criteria->compare('entity_id',$this->entity_id);
        $criteria->compare('name',$this->name,true);
        (etc...)

        if (Yii::app()->user->role == SiteUser::ROLE_AUTHOR) {
            $userId = Yii::app()->user->getId();
            $entity = Entity::model()->find("user_id = $userId");

            $criteria->condition = 'entity_id=:entity_id';
            $criteria->params = array(':entity_id'=>$entity->id);
        }

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

当我申请时:

if (Yii::app()->user->role == SiteUser::ROLE_AUTHOR) {
 $userId = Yii::app()->user->getId();
 $entity = Entity::model()->find("user_id = $userId");

 $criteria->condition = 'entity_id=:entity_id';
 $criteria->params = array(':entity_id'=>$entity->id);
}

用户只能在CGridView上看到是自己的记录。尼斯。 但是,出于某种原因,过滤器无法正常工作

如果我评论这些话:

 $criteria->condition = 'entity_id=:entity_id';
 $criteria->params = array(':entity_id'=>$entity->id);

过滤器有效。但是,显然,用户将看到所有用户记录。

更新: 如果不使用 condition params 属性,我使用compare()方法,如下所示:

$criteria->compare('entity_id',$entity->id);

有效。

为什么它适用于比较,而不是条件和参数?

1 个答案:

答案 0 :(得分:1)

使用时

if (Yii::app()->user->role == SiteUser::ROLE_AUTHOR) {
            $userId = Yii::app()->user->getId();
            $entity = Entity::model()->find("user_id = $userId");

            $criteria->condition = 'entity_id=:entity_id';
            $criteria->params = array(':entity_id'=>$entity->id);
        }

会发生什么情况是条件属性被重置(由于新分配),您之前使用的比较函数会将比较附加到条件中,请参阅http://www.yiiframework.com/doc/api/1.1/CDbCriteria#compare-detail以获取有关其如何工作的信息,因此当您执行此操作时一项新的任务,它清除了所有现有的条件。

因此您可以使用下面的新标准对象

if (Yii::app()->user->role == SiteUser::ROLE_AUTHOR) {
                $userId = Yii::app()->user->getId();
                $entity = Entity::model()->find("user_id = $userId");

                $criteria2= new CDbCriteria();
                $criteria2->condition = 'entity_id=:entity_id';
                $criteria2->params = array(':entity_id'=>$entity->id);
                $criteria->mergeWith($criteria2);
            }

或者您可以在比较语句之前移动SiteUser::ROLE_AUTHOR的逻辑