【问题标题】:Ordered dropDownList using relations?使用关系订购 dropDownList?
【发布时间】:2011-03-07 17:44:58
【问题描述】:

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

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

这可行,但这意味着对于每个下拉列表(有很多),我都会在每个下拉列表中添加 array('order' => 'company ASC'

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

【问题讨论】:

    标签: php yii yii-relations


    【解决方案1】:

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

    您可以定义任意数量的范围来对结果集进行排序并像这样使用它们:

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

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

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

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

    【讨论】:

    • 但是您要发送到数据库的可能是公司 ID,而不是公司名称(将出现在下拉列表中)。您如何处理?
    【解决方案2】:

    我通常为每个模型添加一个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 以更有效的方式获取列表数据。

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 2021-05-05
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多