nar_poghosyan
@nar_poghosyan
Web Developer

Yii2 groupBy. Как решить проблему?

Database Exception – yii\db\Exception
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'rentaltrans.item.alias' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
The SQL being executed was: SELECT COUNT(*) FROM (SELECT `item`.* FROM `item` LEFT JOIN `user` ON `item`.`user_id` = `user`.`id` LEFT JOIN `order` ON `item`.`id` = `order`.`item_id` WHERE ((`user`.`status`=10) AND (`item`.`status`='available') AND (`item`.`deleted`=0)) AND (`user`.`hide_items`=0) AND (`category_id`=1) GROUP BY `item`.`id` ORDER BY `order`.`id` DESC) `c`

Помогите решить проблему.
Вот мой код.

$item = Item::find()
            ->joinWith(['user', 'order'])
	        ->where(['user.status' => User::STATUS_ACTIVE,'item.status' => 'available', 'item.deleted' => 0])
	        ->andWhere(['user.hide_items' => 0])
	        ->groupBy('item.id');
  • Вопрос задан
  • 3762 просмотра
Пригласить эксперта
Ответы на вопрос 2
kimono
@kimono
Web developer
Попробуйте:
$item = Item::find()->select(['item.*'])
            ->joinWith(['user', 'order'])
          ->where(['user.status' => User::STATUS_ACTIVE,'item.status' => 'available', 'item.deleted' => 0])
          ->andWhere(['user.hide_items' => 0])
          ->groupBy('item.id');
Ответ написан
@bkosun
Ваш запрос несовместим с режимом only_full_group_by, существует несколько возможных вариантов решения проблемы:
  • Отключить режим sql_mode = only_full_group_by в настройках MySQL (my.cnf)
  • Установить необходимый режим при подключении (если Вы используете PDO), пример:
    $pdo = new PDO(
         $dsn, 
         $username, 
         $password, 
         array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"') 
    );


    Я не работаю с Yii, но конфигурационный файл должен выглядеть примерно так:

    [
      'type' => 'PDO',
      'connection' => [
        'dsn'  => 'mysql:host=localhost;dbname=database',
        'username'   => 'user',
        'password'   => 'password',
        'persistent' => FALSE,
        'options'  => [
          PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"'
          ],
      ],
      'charset'    => 'utf8',
      'caching'    => FALSE,
    ]


  • Установить необходимый режим для сессии:

    Добавить только один режим в sql_mode без удаления существующих:
    SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));


    Удалить только один режим из sql_mode без удаления других:
    SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));


    Если Вы хотите удалить только режим ONLY_FULL_GROUP_BY, используйте команду ниже:
    SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));


Ответ написан
Ваш ответ на вопрос

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

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