覆盖AR的beforeFind函数后$ar->dbcriteria的condition为空的问题 [ 1.1 版本 ]
现在我手头一个项目是用YII1.1做的, 很多表中有一个逻辑删除标志列is_delete.
由于几乎每个表都有,为了方便每次查询,我覆盖了AR的beforeFind,每次查询时自动添加is_delete='no',代码如下:
class MyAR extends CActiveRecord{
//other code....
public function beforeFind() {
$criteria = $this->dbCriteria; //拿当前的criteria
$attrs = $this->getAttributes(); //取得当前AR中所有列名, 供下面判断是否含有is_delete
$conditions = $criteria->condition; //当前的criteria的where条件
//字段中含有逻辑删除标志,且查询中没有对该标志做出限制的时候
if(array_key_exists('is_delete', $attrs)
&& (strpos($conditions, 'is_delete')===FALSE) ){
$criteria->addCondition("`is_delete`='no'");
$this->setDbCriteria($criteria);
}
parent::beforeFind();
}
//other code....
}
这时候我在controller里使用了find("xxx
='yyy'"),但是在上面我自己写的beforeFind里的$conditions = $criteria->condition中的$condition var_dump出来是空字符串,这是为什么?
为此我看了下CActiveRecord的源代码,他的beforeFind是这样的:
public function find($condition='',$params=array())
{
Yii::trace(get_class($this).'.find()','system.db.ar.CActiveRecord');
$criteria=$this->getCommandBuilder()->createCriteria($condition,$params);
return $this->query($criteria);
}
最后调用了query函数,query函数是这样的:
protected function query($criteria,$all=false)
{
$this->beforeFind();
$this->applyScopes($criteria);
if(empty($criteria->with))
{
if(!$all)
$criteria->limit=1;
$command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria,$this->getTableAlias());
return $all ? $this->populateRecords($command->queryAll(), true, $criteria->index) : $this->populateRecord($command->queryRow());
}
else
{
$finder=$this->getActiveFinder($criteria->with);
return $finder->query($criteria,$all);
}
}
我专门在query第一行var_dump了一下$criteria,发觉此时criteria的condition是正常的.但是一旦进了我写的beforeFind(),$criteria哪怕在第一行var_dump他的condition都是空的.这是为什么?
我现在只能靠覆盖query函数实现自动添加条件的功能...
共 1 个回答
yiissy001
注册时间:2013-12-04
最后登录:2017-09-25
在线时长:24小时55分
最后登录:2017-09-25
在线时长:24小时55分
- 粉丝7
- 金钱2529
- 威望90
- 积分3669