Как правильно сортировать связаные модели?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Sergalas
Сообщения: 626
Зарегистрирован: 2015.10.15, 12:39

Как правильно сортировать связаные модели?

Сообщение Sergalas »

Есть две модели Goods и Price связаны они через модель Goods так

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

public function getPrice(){
        return $this->hasOne(Price::className(),['id'=>'id_price']);
    }

Я так получаю товары

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

    $goods=Goods::find()->with('price');
теперь мне надо отсортировать goods по значению price модели Price
Затем я использую Listviews.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как правильно сортировать связаные модели?

Сообщение vitalik1183 »

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

$goods=Goods::find()->joinWith('price')->orderBy(['price.id'=>SORT_DESC]);
Yii2!
Аватара пользователя
Sergalas
Сообщения: 626
Зарегистрирован: 2015.10.15, 12:39

Re: Как правильно сортировать связаные модели?

Сообщение Sergalas »

vitalik1183 писал(а): 2017.06.28, 16:17

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

$goods=Goods::find()->joinWith('price')->orderBy(['price.id'=>SORT_DESC]);
а без joinWith нельзя ?
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как правильно сортировать связаные модели?

Сообщение vitalik1183 »

что смущает в joinWith?
Yii2!
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как правильно сортировать связаные модели?

Сообщение Alexum »

Sergalas писал(а): 2017.06.28, 16:42
vitalik1183 писал(а): 2017.06.28, 16:17

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

$goods=Goods::find()->joinWith('price')->orderBy(['price.id'=>SORT_DESC]);
а без joinWith нельзя ?
Я так понимаю, что сортировать надо по цене а не по её id.

Можно к ценами через связь подтягивать товары. :P

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

Prices::find()->with('goods')->orderBy('price DESC');
Но если вы используете запрос для DataProvider, то нужен joinWith() и никаких orderBy(), чтобы в виджетах корректно сортировки работали.

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

$query = Goods::find()->joinWith('price p');
настраивать сортировку уже на уровне DataProvider-а через 'sort'.

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

 $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'attributes' => [
                	'id_price' => [
                       		 'asc' => ['p.price' => SORT_ASC, 'product_name' => SORT_ASC],
                       		 'desc' => ['p.price' => SORT_DESC, 'product_name' => SORT_ASC],
                    ],
                    ...
                ],
                'defaultOrder' => ['id_price' =>SORT_DESC]
            ]
        ]);
Ответить