2011-03-07 76 views
5

我在Yii的某些形式使用下列以获得相关表中的数据列表在一个下拉的形式:使用关系排序dropDownList?

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

这工作,但是这意味着每一个下拉列表(那里有很多)我把这个array('order' => 'company ASC'在每一个。

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

回答

5

我认为要做到这一点,正确的方法是使用scopes

您可以定义任意数量的顺序结果集范围,并利用它们像这样:

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

如果您的应用程序总是要求企业在有序进行提取,你甚至可以定义默认范围在您的模型类:

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

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

+0

啊,那正是即时寻找。谢谢! – djt 2011-03-07 18:42:16

+0

但是你想要发送到数据库的可能是公司ID,而不是公司名称(这将出现在下拉列表中)..你如何处理? – 2012-01-31 11:19:48

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以更有效的方式获取列表数据。