Страница 1 из 1

Сортировка в связи

Добавлено: 2019.01.16, 18:41
exort
Всем привет, Как такое осуществить?...
Есть связь в модели Video:

Код: Выделить всё

/**
     * @return \yii\db\ActiveQuery
     */
    public function getCountries()
    {
        return $this->hasMany(Country::class, ['id' => 'country_id'])
            ->viaTable('video_vs_country', ['video_id' => 'id']);
    }
Всё хорошо, только вот я хочу, чтобы $model->countries сортировался по ключу video_vs_country.sort.
В debug-панели видно, что выполняется 2 запроса:
SELECT * FROM "video_vs_country" WHERE "video_id"=731 ORDER BY "sort" // тут всё хорошо, но
SELECT * FROM "country" WHERE "id" IN (9, 113) // тут уже сортировка теряется
Мои таблицы:
Video
id

VideoVsCountry
video_id
country_id
sort

Country
id

При join запросе не было бы проблем. Как поступить в этом случае?

Re: Сортировка в связи

Добавлено: 2019.01.17, 12:59
andku83

Код: Выделить всё

public function getCountriesSorted()
    {
        return $this->hasMany(Country::class, ['id' => 'country_id'])
            ->viaTable('video_vs_country', ['video_id' => 'id'])
            ->joinWith('videoVsCountry videoVsCountry', false)
            ->orderBy('videoVsCountry.sort');
    }

Код: Выделить всё

$model = Model::find()->...->with('countriesSorted');
$result = $model->countriesSorted;
Если получается одна модель with() можно не использовать.

Re: Сортировка в связи

Добавлено: 2019.01.17, 13:28
exort
Спасибо, получилось!

Re: Сортировка в связи

Добавлено: 2019.01.17, 13:41
andku83
и более короткий вариант с использованием существующей связи:

Код: Выделить всё

public function getCountriesSorted()
    {
        return $this->getCountries()
            ->joinWith('videoVsCountry videoVsCountry', false)
            ->orderBy('videoVsCountry.sort');
    }