2015-11-30 3 views
3

Я немного смущен, потому что здесь, в поле зрения , они делают прямой вызов модели, не передавая ее через контроллер. http://www.yiiframework.com/doc-2.0/guide-input-forms.html Выделите в нижней части страницы ...Должен ли я позвонить модели прямо из вида yii2

echo $form->field($model, 'product_category')->dropdownList(
    ProductCategory::find()->select(['category_name', 'id'])->indexBy('id')->column(), 
    ['prompt'=>'Select Category'] 
); 

И руководство здесь http://www.yiiframework.com/doc-2.0/guide-structure-views.html в нижней части снова есть раздел Best Prictice и один из темы является: (просмотров) следует не содержат код, который выполняет запросы БД. Такой код должен быть выполнен в моделях.

Благодаря

ответ

2

Я согласен с вами о понимании «лучшей практики». Я думаю, нам следует избегать вызова методов, которые выполняют запросы db внутри представлений. Кроме того, все запросы уже находятся в модели. Поэтому для меня нет смысла иметь внешние запросы вне этого.

Я работал с некоторыми проектами с использованием рамки Yii2 (не созданной мной), и я просто сделал быстрый поиск здесь. Единственный случай, который я имел в чем-то подобном, был именно тогда, когда у нас есть форма или gridview и пытается показать все вхождения другой модели.

В этом сценарии я предпочитаю создавать функцию в своей модели, чтобы справиться с этим. Что-то вроде:

МОДЕЛЬ

/** 
* @return array 
*/ 
public function getAllAnotherModel() 
{ 
    return AnotherModel::find()->all(); 
} 

ВИД:

<?= $form->field($model, "id_another_model")->dropDownList(
    ArrayHelper::map($model->allAnotherModel, 'id', 'name'), 
    ['prompt' => 'Select'] 
) ?> 
+0

лол ... Это здорово, очень хороший вариант! Благодаря! –

+0

Обновлен ответ. Я забыл добавить префикс «get» в этой функции, mb. Вы можете использовать либо это, либо удалить префикс «get» и просто вызвать '$ model-> allAnotherModel()' – Clyff

+0

. Ах, спасибо, я это скоро реализую. –

Смежные вопросы