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