Laravel DB: select () требует, чтобы все столбцы в группе - PullRequest
1 голос
/ 22 марта 2019

Мне нужно выполнить пользовательский запрос, и я попробовал все эти методы

$sql = "SELECT acd.*, DATE_FORMAT(acd.cdate, '%d/%m/%Y') cdate_disp,
  GROUP_CONCAT(CONCAT_WS(', ', car.type, car.session, crd.name) SEPARATOR '<br />') rd_names,
  acb.booking_status my_booking_status
FROM app_data acd
INNER JOIN crmaccounts ca ON ca.id = acd.client_crm_id
LEFT JOIN crmaccount_rdids car ON car.account_id = ca.id
LEFT JOIN crmrd_ids crd ON crd.id = car.rd_id
LEFT JOIN app_bookings acb ON acb.call_ref_id = acd.call_ref AND acb.user_id = 12391
WHERE 1=1 
AND acd.client_crm_id NOT IN (select account_id from bstaff WHERE user_id=12391)
GROUP BY acd.id
ORDER BY acd.cdate, ctiming";

DB:select($sql);

кидает

Подсветка \ База данных \ QueryException (42000) SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 «mydatabase.acd.call_ref» отсутствует в GROUP BY (SQL: ....)

DB::select($sql);

DB::raw($sql);

DB::select(DB::raw($sql));

//even with pdo 
$sth = DB::getPdo()->prepare($sql);
$sth->execute();
$data = $sth->fetchAll(\PDO::FETCH_OBJ);

 PDOException (42000)
SQLSTATE[42000]: Syntax error or access violation: 1055 'mydatabase.acd.call_ref' isn't in GROUP BY

Кажется, что единственный способ начать работу - перечислить все столбцы таблицы в group by, что выполнимо, но не удобно.

Я могу выполнить тот же запрос непосредственно в phpmyadmin. Поэтому я не уверен, почему, когда я запускаю его через Laravel, он просит добавить все столбцы.

У меня установлена ​​MariaDB, и Laravel и PhpMyAdmin подключаются к одному экземпляру. Larvel версия 5.8.5.

Пожалуйста, посмотрите на полный запрос, так как я тоже задавал вопрос здесь, но не смог найти ответа - https://laracasts.com/discuss/channels/eloquent/query-runs-ok-in-phpmyadmin-but-dbselect-throws-exception

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Вы должны попытаться отключить строгий режим в config/database.php, в разделе подключения mysql.

0 голосов
/ 22 марта 2019

Я установил Laravel 4.8, а также настроил аутентификацию.Более того, я добавил две таблицы, называемые ролью и состояниями, и попробовал ваш код pdo - он отлично работает для меня!Здесь я поместил свой код.

$sql = "SELECT * 
            FROM users u
            INNER JOIN roles r ON r.id = u.role_id
            LEFT JOIN states s ON s.id = u.state_id

            WHERE 1=1 

            GROUP BY u.id
            ORDER BY u.id ";

    $sth = DB::getPdo()->prepare($sql);
    $sth->execute();
    $data = $sth->fetchAll(\PDO::FETCH_OBJ);

    dd($data);

Я хочу знать, какова ваша структура БД.

0 голосов
/ 22 марта 2019

Это не проблема Laravel, а логическое ограничение MySQL. Когда вы добавляете в набор результатов столбцы, которых нет в предложении GROUP BY, для этих столбцов могут быть разные значения в наборе результатов.

При выполнении запросов в строгом режиме (который включен по умолчанию) MySQL не допустит этого, поскольку это может привести к неожиданным результатам. Если вы отключите строгий режим, MySQL будет использовать первый найденный результат для этих столбцов.

Вы можете отключить строгий режим в ваших конфигурационных файлах Laravel в config/database.php. Однако вместо этого рекомендуется изменить ваш запрос из-за непредсказуемости.

Полный список проверок в строгом режиме можно найти в документации MySQL: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict

...