Заказал dropDownList используя отношения? - PullRequest
5 голосов
/ 07 марта 2011

У меня есть несколько форм в Yii, использующих следующее для получения списков данных из связанных таблиц в форме раскрывающегося списка:

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

Это работает, но это означает для каждого раскрывающегося спискаTheres много) Я помещаю это array('order' => 'company ASC' в каждом.

Это лучший способ сделать это?Разве нет способа получить эти данные, используя отношения модели () и указав порядок внутри отношения?

Ответы [ 2 ]

5 голосов
/ 07 марта 2011

Я считаю, что правильный способ сделать это - использовать области действия .

Вы можете определить любое количество областей, которые упорядочивают набор результатов, и использовать их следующим образом:

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

Если ваше приложение всегда требует, чтобы компании выбирались в отсортированном порядке, вы даже можете определить область по умолчанию в классе вашей модели:

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

Это приведет к тому, что каждый вызов Company::model()->findAll(); будет возвращать отсортированные результаты.

1 голос
/ 06 марта 2013

Я обычно добавляю 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 для более эффективного извлечения данных из списка.

...