YiiFramework Yii2 - hasMany сортировка записей

StalkerClasses

Новичок
Есть три таблицы
Таблица 1
Таблица 2
Список выбранных записей в таблице 1 из таблицы 2 сохраняется в промежуточно таблице (таблица 3). Здесь же в таблице 3 сохраняется сортировка - то как и в какой последовательности пользователь выбрал записи.

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

StalkerClasses

Новичок
Уже так много просмотров темы - неужели никто не сталкивался с подобной задачей и нет готового метода реализации?
 

AmdY

Пью пиво
Команда форума
доку открой, там в with или via можно передать ассоциативный массив со значение кэллбэк функцией, где и добавишь свою сортировку.
 

StalkerClasses

Новичок
Находил примеры как это делается, но все примеры показывают как отсортировать таблицу №2, а не выборку из промежуточной таблице. У меня сортировка храниться в промежуточной таблице.

Таблица 1 (машина)
Ваз
Газ
Уаз

Таблица 2 (водитель на смену)
Петя
Саша
Даша
Маша

В таблице №3 сохраняется сортировка выбранных водителей
Код:
Ваз:
- Даша (сортировка 1)
- Маша (сортировка 2)

Газ
- Петя (сортировка 1)
- Даша (сортировка 2)

Уаз
- Маша (сортировка 1)
- Петя (сортировка 2)
- Саша (сортировка 3)
Все примеры что находил сортируют на основе той сортировки что есть в таблице №2.
 

StalkerClasses

Новичок
Код:
->viaTable($current_table.'_mm', ['uid_foreign' => 'uid'],
                            function ($query) {
                                /* @var $query \yii\db\ActiveQuery */
                                global $current_table, $current_field;
                                  $query ->orderBy([$rel_table.'.uid' => SORT_ASC]);
                        })
Нашел примеры как это делается. И сортировать получается.
Но проблема в том что выборка из третей таблицы идет через IN() и его не как не получается отсортировать в зависимости от того как был отсортирован "viaTable"
 

AmdY

Пью пиво
Команда форума
Ну, праивльно же мыслишь, осталось ещё раз отсортировать за пределами via. И не знаю на какой помойке ты искал примеры и зачем там $current_table и т.д., но их хотя бы через use в замыкание стоит передовать, а не городить глобальные переменные.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ActiveRecord создан для простых запросов. Авторы yii несколько лет думали над оберткой для связей по нескольким таблицам, и решили отказаться. Лучше написать это несколькими запросами с Query Builder.
 

StalkerClasses

Новичок
доку открой, там в with или via можно передать ассоциативный массив со значение кэллбэк функцией, где и добавишь свою сортировку.
Очень бы хотел живой пример!

Пока решение которое нашел для сортировки:
Код:
public function getDocument()
{
return $this->hasMany(TxDocument::className(), ['id' => 'id_local'])
->viaTable('type_work_mm', ['id_foreign' => 'id'])

// Сортировка
->addSelect('document.*')
->addSelect('t2.id_local')
->addSelect('t2.id_foreign')
->addSelect('t2.sorting_foreign')
->innerJoin(['t2'=>'type_work_mm'],'t2.id_local = document.id')
->orderBy('t2.sorting_foreign ASC');
}
 
Сверху