我在 Yii 中有一些表单,使用以下内容以下拉列表的形式从相关表中获取数据列表:
dropDownList(CHtml::listData(Company::model()->findAll(array('order' => 'company ASC'))));
这行得通,但这意味着对于每个下拉列表(有很多),我都将其放入每个下拉列表array('order' => 'company ASC'
中。
这是最好的方法吗?有没有办法使用模型关系()获取这些数据,并指定关系中的顺序?
我在 Yii 中有一些表单,使用以下内容以下拉列表的形式从相关表中获取数据列表:
dropDownList(CHtml::listData(Company::model()->findAll(array('order' => 'company ASC'))));
这行得通,但这意味着对于每个下拉列表(有很多),我都将其放入每个下拉列表array('order' => 'company ASC'
中。
这是最好的方法吗?有没有办法使用模型关系()获取这些数据,并指定关系中的顺序?
我相信正确的方法是使用scopes。
您可以定义任意数量的范围来对结果集进行排序并像这样使用它们:
Company::model()->scopeName()->findAll();
如果您的应用程序总是要求按排序顺序获取公司,您甚至可以在模型类中定义默认范围:
public function defaultScope() {
return array('order' => 'company ASC');
}
这将导致每次调用都Company::model()->findAll();
返回排序结果。
我通常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 以更有效的方式获取列表数据。