Как вывести данные из двух связанных таблиц в 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 шт):

Автор решения: fedornabilkin

В классе модели должен быть определен метод реляции, чтобы можно было получить из модели самолета данные о модели производителя. Это в случае, если мы перебираем список самолетов. Тогда код может выглядеть следующим образом.

$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']);
}
→ Ссылка
Автор решения: delikates

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.

→ Ссылка