Yii2 зависимый dropdownlist с разными моделями?

В Yii2 можно использовать зависимый dropdownlist с разными моделями, используя AJAX и JavaScript для обновления значения второго списка на основе выбранного значения в первом списке. Для этого нужно выполнить следующие шаги:

1. Создать две модели, связанные между собой. Например, модель Country и модель City, где Country имеет множество городов.

// Модель Country
class Country extends ActiveRecord
{
    // ...
    public function getCities()
    {
        return $this->hasMany(City::class, ['country_id' => 'id']);
    }
}

// Модель City
class City extends ActiveRecord
{
    // ...
    public function getCountry()
    {
        return $this->hasOne(Country::class, ['id' => 'country_id']);
    }
}

2. Создать контроллер с двумя действиями: одно для получения списка городов для выбранной страны, и другое для рендеринга представления, содержащего dropdownlists.

class SiteController extends Controller
{
    // ...
    public function actionGetCities($countryId)
    {
        $cities = City::findAll(['country_id' => $countryId]);
        $options = [];
        foreach ($cities as $city) {
            $options[$city->id] = $city->name;
        }
        return Json::encode($options);
    }
    
    public function actionIndex()
    {
        $model = new Model();
        $countries = ArrayHelper::map(Country::find()->all(), 'id', 'name');
        
        return $this->render('index', [
            'model' => $model,
            'countries' => $countries,
        ]);
    }
}

3. Создать представление с двумя dropdownlists и JavaScript для обновления второго списка при изменении значения в первом списке.

<?php

use yiihelpersHtml;
use yiiwidgetsActiveForm;
use yiihelpersUrl;

?>

<?php $form = ActiveForm::begin(); ?>

<?= $form->field($model, 'country_id')->dropDownList($countries, [
    'prompt' => 'Select a country',
    'onchange' => '
        $.get("' . Url::toRoute(['site/get-cities']) . '", { countryId: $(this).val() })
            .done(function(data) {
                var cities = JSON.parse(data);
                var options = "";

                $.each(cities, function(id, name) {
                    options += "<option value="" + id + "">" + name + "</option>";
                });

                $("#city-id").html(options);
            });
    ',
]) ?>

<?= $form->field($model, 'city_id')->dropDownList([], ['id' => 'city-id', 'prompt' => 'Select a city']) ?>

<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>

<?php ActiveForm::end(); ?>

В этом примере, при изменении значения в первом списке (country_id), выполняется AJAX-запрос к действию actionGetCities, которое возвращает список городов для выбранной страны в формате JSON. Затем JavaScript обрабатывает полученный список и обновляет второй dropdownlist (city_id) в соответствии с выбранным значением в первом списке.

Надеюсь, эта информация поможет вам создать зависимый dropdownlist с разными моделями в Yii2.