使用关系订购dropDownList?

时间:2011-03-07 17:44:58

标签: php yii yii-relations

我在Yii中有一些表单,使用以下内容以下拉形式从相关表中获取数据列表:

dropDownList(CHtml::listData(Company::model()->findAll(array('order' => 'company ASC'))));

这是有效的,但这意味着对于每个下拉列表(其中很多)我将array('order' => 'company ASC'放在每个下载列表中。

这是最好的方法吗?有没有办法使用模型关系()获取此数据,并指定关系中的顺序?

2 个答案:

答案 0 :(得分:5)

我认为正确的方法是使用scopes

您可以定义任意数量的对结果集进行排序的范围,并按如下方式使用它们:

Company::model()->scopeName()->findAll();

如果您的应用程序始终要求按排序顺序提取公司,您甚至可以在模型类中定义默认范围:

public function defaultScope() {
    return array('order' => 'company ASC');
}

这将导致每次调用Company::model()->findAll();返回已排序的结果。

答案 1 :(得分:1)

我通常会为每个模型添加一个opts()方法,可以用作下拉列表的来源:

class Company extends CActiveRecord
{
    // ...

    public static opts()
    {
        $opts = array();
        foreach(self::model()->findAll(array('order'=>'name ASC')) as $model)
            $opts[$model->id] = $model->name;
        return $opts;
    }

它像这样使用

echo $form->dropDownList($user, 'company_id', Company::opts());

如果您在页面上多次需要相同的选项,您甚至可以将结果“缓存”到私有静态类变量中,或者使用DAO以更有效的方式获取列表数据。