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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
exort
Сообщения: 4
Зарегистрирован: 2018.12.29, 01:51

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

Сообщение exort » 2019.01.16, 18:41

Всем привет, Как такое осуществить?...
Есть связь в модели 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 запросе не было бы проблем. Как поступить в этом случае?

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

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

Сообщение andku83 » 2019.01.17, 12:59

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

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() можно не использовать.

exort
Сообщения: 4
Зарегистрирован: 2018.12.29, 01:51

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

Сообщение exort » 2019.01.17, 13:28

Спасибо, получилось!

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

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

Сообщение andku83 » 2019.01.17, 13:41

и более короткий вариант с использованием существующей связи:

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

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

Ответить