当然这是可能的。您可以创建如下范围:
public function scopes()
{
return array(
'enabled' => array(
'condition' => 'status=0',
),
'banned' => array(
'condition' => 'status=1',
),
);
}
然后在你的查询中你会有类似的东西:
$activeUsers = User::model()->enabled()->findAll();
$bannedUsers = User::model()->banned()->findAll();
此外,您可以命名范围:
public function statusIs($status)
{
// you can accept a status string here and translate it in an integer, your choice.
return $this->getDbCriteria()->mergeWith(array(
'condition' => 'status = '.(int)$status
));
}
并在您的查询中使用它,例如:
User::model()->statusIs(0)->findAll();// get all enabled
此外,您还可以使用范围查询相关模型,例如:
Posts::model()->with('users:enabled')->findAll();
也应该工作。
只需查看http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes并查看更多信息。
乐:
public function getStatuses()
{
return array(
'0' => Yii::t("status", 'Enabled'),
'1' => Yii::t("status", 'Banned'),
'2' => Yii::t("status", 'Disabled'),
);
}
public function getStatusesDropDown(array $htmlOpts = array())
{
return CHtml::activeDropDownList($this, 'status', $this->getStatuses(),$htmlOpts);
}
现在您已经有了下拉代码,在您的 CActiveForm 或任何其他显示此状态下拉列表的表单中,例如:
echo $model->getStatusesDropDown();
当您从下拉列表中选择状态并提交表单时,YourModel[status]
将提交命名的输入。这将具有 0 或 1 或 2 的值。接下来,在您的search()
方法中,您必须:
public function search()
{
$criteria = new CDbCriteria;
[...]
if ($this->status !== null && (int)$this->status >= 0) {
$criteria->compare('status', (int)$this->status);
}
[...]
}
差不多就是这样。