Как вывести данные из двух связанных таблиц в dropDownList Yii2
Необходимо реализовать выборку данных в dropDownList из двух таблиц. А именно название производителя (name) и модель самолёта (model).
-Таблица производитель
--id
--name
-Таблица самолет
--id
--model
--производитель_id
-Таблица рейс
--id
--id_самолет
...
Как я делаю:
<?= $form->field($model, 'plane_id')->dropDownList(ArrayHelper::map(Plane::find()
->joinWith(['manufacturer'])
->all(), 'plane_id', 'model')) ?>
Если надо что-то уточнить - пишите.
Ответы (2 шт):
В классе модели должен быть определен метод реляции, чтобы можно было получить из модели самолета данные о модели производителя. Это в случае, если мы перебираем список самолетов. Тогда код может выглядеть следующим образом.
$form->field($model, 'plane_id')->dropDownList(
ArrayHelper::map(
Plane::find()->joinWith(['manufacturer'])->all(),
'plane_id',
function ($plane){
return $plane->vendor->name . ' ' . $plane->name;
}
)
)
Где, vendor - это обращение к методу реляции в модели Plane. Метод в классе модели самолетов может выглядеть примерно так.
public function getVendor()
{
return $this->hasOne(Vendor::class, ['plane_id' => 'id']);
}
Cоздайте в модели метод получения списка для dropDownList, например getMappedPlaneWithManafacturersList в котором в query-builder опишите получение этого поля. Например:
(new Query()->select(['p.id', new Expression('p.model||m.name as name')])->from(Plane::tableName().' p')->innerJoin(Manufacturer::tableName().' m', 'm.id = p.manufacturer_id')->all()
После чего оберните это все в ArrayHelper::map(...,['id','name']) и верните наружу.
Соответственно после этого Вы может спокойно вызвать это метод в нужном месте.
Вы одним запросом получите нужные Вам данные. Тогда как получение через relation на каждую запись из таблицы Plane вызовет дополнительный запрос select .. from manufacturer where id = ..., что при больших объемах данных может существенно нагрузить сервер БД. Все это Вы можете и сами увидеть после рендеринга страницы в панели дебага Yii2.