@shtepsil
IT специалист в вэбразработке

Как сортировать элементы по полю связанной таблицы в Yii2?

Есть модели `ProductNomeclature` и `Brand`. А у модели `Brand` есть свойства `name`.
Как получить отсортированные строки таблицы ProductNomeclature, по полю `name` модели `Brand`?

В таблице ProductNomeclature есть поле "brand_code" - это ID бренда, таблицы brand.

После выборки я конечно же могу отсортировать массив, но мне нужна сортировка именно ещё на стадии выборки (SQL запроса). Сортировка массива ПОСЛЕ выборки, по вложенным значениям мне не подходит!!

В запросе такого вида, сортируются данные, которые выбираются из связанной таблицы brand:
$items = ProductNomeclature::find()
        ->with([
            'brand' => function ($query) {
                $query->orderBy('name', 'ASC');
            }
        ])
        ->all();


Но у меня по связи из таблицы brand, для каждой строки таблицы ProductNomeclature выбирается только один бренд, по этому там сортировка не нужна.
А нужно чтобы все строки из ProductNomeclature - сортировались по полю 'name' из таблицы brand

Вот так не работает:
$items = ProductNomeclature::find()
        ->with(['brand'])
        ->orderBy('name', 'ASC')
        ->all();


Потому что поля 'name' в таблице ProductNomeclature не существует.
Пробовал делать и так: ->orderBy('brand.name', 'ASC') - тоже не работает.
Говорит что в ProductNomeclature - поля brand.name не существует.

В гугле перерыл МНОГО ГДЕ! - Не нашел ничего подходящего.
Есть варианты, но для Laravel. Для Yii2 они не подходят.
В Yandex тоже много где рыл, не нашел ничего подходящего.

Очень очень буду благодарен за помощь в решении этой задачи.
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@Arik
with юзает отдлеьный запрос с IN(), выходит первый запрос ничего не знает про вторую таблицу, соответственно нужно переделать под join запросы
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
coderisimo
@coderisimo
Кому помог, не забывайте о СПАСИБО, б..! :-)
А вы пробовали прописать сортировку прямо в реляции ?

// пример реляции с сортировкой
public function getPrices()
{
    return $this->hasMany(Prices::className(), ['device_id' => 'id'])->
      orderBy(['device_price' => SORT_DESC]);
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы