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