Заказал dropDownList используя отношения?

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

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

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

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

2 ответа

Решение

Я считаю, что правильный способ сделать это с помощью прицелов.

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

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

Другие вопросы по тегам