关于ActiveRecord使用的最佳做法,我有以下问题。
我的情况:
我有一个普通CActiveRecord
的用户模型。
在许多情况下,我希望有“活动”用户列表,在WHERE条件“is_active = 1”的数据库中定义。此外,我希望函数find()
,findByAttributes()
,findByPk()
等仅在用户处于活动状态时返回结果(例如在“密码请求”方案中)。
我总是可以在使用find()
函数之前显式应用这个WHERE条件,但我正在寻找一种用更少的代码实现它的方法。
我想到了创建一个名为UserActive的子类并改变其构造函数的想法:
function __construct($scenario='insert') {
parent::__construct($scenario);
$criteria = new CDbCriteria();
$criteria->condition = "is_active = 1";
$this->setDbCriteria($criteria);
}
但我不确定这是否是一个很好的做法(因为CActiveRecord
的构造函数要求“除非绝对必要,否则不要覆盖构造函数!”) 。任何人都可以为这种情况提供建议吗?
答案 0 :(得分:5)
在您的模型中尝试此操作。
public function defaultScope() {
return array(
'condition'=>'is_active = 1',
);
}
或定义其他范围 Yii - using relations with scopes defined in the relation
答案 1 :(得分:1)
没错,你永远不应该覆盖__construct()
。
您可以使用模型范围。见http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes