Как сделать orderBy из 2 таблиц используя AR with?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Akulenok
Сообщения: 437
Зарегистрирован: 2014.05.05, 18:32
Откуда: localhost

Как сделать orderBy из 2 таблиц используя AR with?

Сообщение Akulenok »

Есть 2 таблицы, paper и paper_category
в обеих есть поле position по которому мне надо их отсортировать. paper.position DESC и paper_category.position DESC
Вывести надо через dropDownList так
CATEGORY1
-paper1
-paper2
CATEGORY2
-paper5
-paper8
Делаю так

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

$array = Paper::find()
            ->asArray()
            ->JoinWith(['category' => function($query) {
                $query->orderBy(['paper_category.position' => SORT_DESC]);
            }])->all();
             return ArrayHelper::map($array, 'id', 'title', 'category.title');
категории выводит в нужном порядке, а саму бумагу нет, любые вставки в код типа paper.position' => SORT_DESC переключают на сортировку бумаги, и по категории уже не сортирует.

Подскажите мне вариант?
хотел сделать через ArrayHelper::multisort но тоже не получается
ភាសាខ្មែរ Yii2 - это кайф!
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Как сделать orderBy из 2 таблиц используя AR with?

Сообщение SiZE »

1) имена методов чувствительны к регистру под никсами JoinWith -> joinWith

2) joinWIth по умолчанию использует жадную загрузку поэтому сортировка не может использоваться вместе с основным запросом

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

Paper::find()
  ->innerJoinWith('category category', false)
  ->orderBy([
    'category.position' => SORT_DESC,
    Paper::tableName().'.title' => SORT_ASC
  ])
  ->asArray()
  ->all();
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Как сделать orderBy из 2 таблиц используя AR with?

Сообщение Loveorigami »

Точнее

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

$data = Paper::find()
  ->alias('p')
  ->innerJoinWith('category c') // делаю жадную
  ->orderBy([
    'c.position' => SORT_DESC,
    'p.position' => SORT_DESC,
    'p.title' => SORT_ASC,
  ])
  ->all();
  
  return ArrayHelper::map($data, 'id', 'title', 'category.title'); // чтобы тут category.title не доставать отдельным запросом
  
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Как сделать orderBy из 2 таблиц используя AR with?

Сообщение SiZE »

Loveorigami писал(а): 2019.02.09, 10:37 Точнее
А что жадная загрузка научилась влиять на ранжирование основного запроса? Я не проверял, но мне кажется там должно возникнуть ошибка.
Аватара пользователя
Akulenok
Сообщения: 437
Зарегистрирован: 2014.05.05, 18:32
Откуда: localhost

Re: Как сделать orderBy из 2 таблиц используя AR with?

Сообщение Akulenok »

Loveorigami писал(а): 2019.02.09, 10:37 Точнее

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

$data = Paper::find()
  ->alias('p')
  ->innerJoinWith('category c') // делаю жадную
  ->orderBy([
    'c.position' => SORT_DESC,
    'p.position' => SORT_DESC,
    'p.title' => SORT_ASC,
  ])
  ->all();
  
  return ArrayHelper::map($data, 'id', 'title', 'category.title'); // чтобы тут category.title не доставать отдельным запросом
  
Спасибо, то что надо, сам бы не до пер
ភាសាខ្មែរ Yii2 - это кайф!
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Как сделать orderBy из 2 таблиц используя AR with?

Сообщение Loveorigami »

SiZE писал(а): 2019.02.09, 12:32 А что жадная загрузка научилась влиять на ранжирование основного запроса?
Она же не внутри анонимки, как на примере выше. А внутри одного метода.
Ошибок не будет. ТС проверил )
Ответить