Yii 向模型中的每个查询添加条件

Yii 向模型中的每个查询添加条件,yii,Yii,我有一个系统,MySQL数据库中的所有表都填充了外部数据(每5分钟与另一个系统同步一次)。所有表都有一列DELFLAG,用于标记禁用的条目 因此,我有大约15个Yii AR模型与这些表相链接。每当我进行查询时,我都需要添加类似于$criteria->addCondition('DELFLAG=0')的内容。如果查询中存在多个表,这会变得很糟糕,因为每个表都有该标志。而且,如果我忘记了其中一个条件,就有可能出错 我现在是这样做的: public function search($showtype

我有一个系统,MySQL数据库中的所有表都填充了外部数据(每5分钟与另一个系统同步一次)。所有表都有一列
DELFLAG
,用于标记禁用的条目

因此,我有大约15个Yii AR模型与这些表相链接。每当我进行查询时,我都需要添加类似于
$criteria->addCondition('DELFLAG=0')
的内容。如果查询中存在多个表,这会变得很糟糕,因为每个表都有该标志。而且,如果我忘记了其中一个条件,就有可能出错

我现在是这样做的:

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

    if (isset($showtype)) {
        $criteria->with = array(
            'TSSSHOW',
            'TSSSHOW.TSSSHOWTYPEITEM',
            'TSSSHOW.TSSSHOWTYPEITEM.TSSSHOWTYPE'
        );
        $criteria->compare('TSSSHOWTYPEITEM.TSSSHOWTYPEID', $showtype);
        $criteria->addCondition('TSSSHOW.DELFLAG=0');
        $criteria->addCondition('TSSSHOWTYPEITEM.DELFLAG=0');
    }

    $exp = new CDbExpression("`TSSEVENT_START_DATETIME` > NOW()");
    $criteria->addCondition($exp);
    $criteria->addCondition('t.DELFLAG=0');
    $criteria->together = true;
    $criteria->order = 't.TSSEVENT_START_DATETIME ASC';

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

是否有一种方便的方法将此条件包含到包含这些表的每个查询中?也许我的模型将从一个特殊的类(与默认的
CActiveRecord
相反)

您可以创建自己的类,例如CustomActiveRecord扩展了CActiveRecord 然后,您应该用您的条件重写findAll、findByPk方法


另一种解决方案是在每次导入后运行此查询“DELETE FROM table_name WHERE DELFLAG=1”。

我建议为这些模型声明命名范围:

public function scopes()
{
    return array(
        'disabledEntry'=>array(
            'condition'=>'DELFLAG=1',
        ),
    );
}
使用命名范围:
Model::Model()->disabledEntry()->findAll()
在with()语句中重新关联到模型时,也可以提供作用域:
ModelA::model()->with('model:disabledEntry')->findAll()

但如果每次都必须设置此条件,则可以设置defaultScope:

public function defaultScope()
{
    return array(    
        'condition' => 'DELFLAG=0',
    );      
}
因此,默认情况下,此模型将具有此条件


更新:由于在多个模型中有同名列,因此在构建sql查询时,YII可能会遇到一些列名称模糊的问题。如果是这种情况,请在范围声明中使用
alias
,或者在声明范围
'condition'=>$this->getTableAlias(false,false)时使用以下语句显式设置当前表别名。DELFLAG=0',

您的所有表都有这种情况?我无法从数据库中删除这些条目,因为它会破坏同步系统。至于你提到的方法,我认为它们根本没有被调用。至少我使用的是
cactivedaptaprovider
。这可能就是我要做的。我想我还必须扩展模型,以便新的数据提供程序类将我的特殊模型与普通模型区分开来;或者您可以尝试重写CactiveRecord中的beforeFindInternal()方法谢谢,
defaultScope
正是我所需要的(使用
getTableAlias
)。