我有以下内容:
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);
有效。
为什么它适用于比较,而不是条件和参数?
答案 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
的逻辑