webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg

Как сгруппировать и отсортировать данные в AR?

Есть две таблицы. Product (id, title и т.д.) и SalonProduct (id, product_id, salon_id и т.д.)
Есть связь в моделе Product есть связь SalonProduct.
Надо выбрать вначале все Product у которых связь SalonProduct не возвращает null, а потом дополнить
Пробовал так :
$query = Product::find()->joinWith('salonProduct')->andWhere(['<>','salon_product',null]);
        $query_null = Product::find()->joinWith('salonProduct')->andWhere(['salon_product'=>null]);
        $query->union($query_null);

Ошибка.
Киньте идею.

На самом деле меня должно устроить это:
$query = Product::find()->joinWith('salonProduct');
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 24,
            ],
            'sort' => [
                'defaultOrder' => [
                    'salon_product.product_id' => SORT_ASC
                ]
            ],
        ]);

Но опять ошибка. Invalid argument supplied for foreach() в yiisoft\yii2\data\Sort.php
  • Вопрос задан
  • 199 просмотров
Пригласить эксперта
Ответы на вопрос 2
bitver
@bitver
SELECT * FROM table ORDER BY CASE WHEN salon_id = NULL THEN 1 ELSE 0 END;
Как это работает можно проверить здесь

Зайти сюда www.w3schools.com/sql/trysql.asp?filename=trysql_s...
Вписать это -
SELECT * FROM Customers
ORDER BY CASE WHEN City = "London" THEN 0
    ELSE 1
END;
И результат вроде тот, что вам нужен.

Ответ написан
cimmwolf
@cimmwolf
Веб-разработчик
Вам не обязательно создавать дополнительное поле в базе. Вы можете использовать конструкцию If внутри Select и результат этой функции вывести как дополнительную колонку.

На чистом SQL это будет выглядеть так:
SELECT *, IF(`salon_product`.`salon_id` IS NULL, 0, 1) AS `mark` 
FROM `salon_product` 
ORDER BY `mark` DESC


В вашем случае должен сработать вот такой код:
$c = new CDbCriteria();
$c->select = '*, , IF(`sp`.`salon_id` IS NULL, 0, 1) AS `mark` ';
$c->join = 'LEFT JOIN `SalonProduct` `sp` ON `t`.`id` = `sp`.`product_id`';
$c->order = '`mark` DESC';
$products = Product::model()->findAll($c);
Ответ написан
Ваш ответ на вопрос

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

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