Задать вопрос
Bandicoot
@Bandicoot
Вась-программист

Можно ли при выборке через связи сохранить порядок, указанный в промежуточной таблице?

Есть 2 таблицы - паттерны и действия, связанные между собой через промежуточную таблицу (многие-ко-многим). Мне нужно получить все действия какого-либо паттерна, в определенном порядке. Делаю я это через связи.
В модели паттерна я сделал так:
public function getPatternMoves()
    {
        return $this->hasMany(PatternMove::className(), ['pattern_id' => 'id'])
            ->orderBy('order_num ASC');
    }
    
    public function getMoves()
    {
        return $this->hasMany(Move::className(), ['id' => 'move_id'])
            ->via('patternMoves');
    }

Как можно догадаться, колонка order_num, отвечающая за порядок вывода, находится в промежуточной таблице. А проблема в том, что сортировка не работает. На уровне запросов происходит следующее:
Здесь она есть:
SELECT * FROM `pattern_moves` WHERE `pattern_id`=1 ORDER BY `order_num`

А вот здесь уже теряется:
SELECT * FROM `moves` WHERE `id` IN (4, 2, 3)

Как можно это перебороть средствами ActiveRecord в Yii2? Или придется обойтись без связей?
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 3
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Сделайте через join, иначе не получится
Ответ написан
@profaller
Скорее всего вы делаете выборку через with, но в таком случае Yii сделает 2 запроса. Чтобы это исправить просто сделайте выборку через joinWith.
Ответ написан
Комментировать
Bandicoot
@Bandicoot Автор вопроса
Вась-программист
Спасибо всем, кто дал наводку использовать joinWith. Получилась такая выборка:
public function getMoves()
{
    return Move::find()
        ->joinWith('patternMove')
        ->where(['pattern_id' => $this->id])
        ->orderBy('order_num')
        ->all();
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@davidnum95
public function getMoves()
    {
        return $this->hasMany(Move::className(), ['id' => 'move_id'])
            ->viaTable('pattern_moves',   ['pattern_id' => 'id'])->orderBy('order_num ASC');
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы