2015-08-24 10:54:11 2967次浏览 1条回答 0 悬赏 100 金钱

现在我手头一个项目是用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函数实现自动添加条件的功能...

  • 回答于 2015-09-25 21:09 举报

    不知道老大说什么问题。

    我只发现
    findByAttributes和beforeFind同时使用是有bug的,beforeFind不起作用

您需要登录后才可以回答。登录 | 立即注册
yiissy001
总监

yiissy001

注册时间:2013-12-04
最后登录:2017-09-25
在线时长:24小时55分
  • 粉丝7
  • 金钱2529
  • 威望90
  • 积分3669

热门问题