Laravel: ошибка синтаксиса или нарушение доступа: 1055 Ошибка
Я хочу использовать WhereIn и Groupby в том же запросе, чтобы получить результат.
Я пробовал это:
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
Но я получил сообщение об ошибке:
SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: 1055 'sbrtpt.loading.id' не находится в GROUP BY (SQL: выберите * из загрузки, где id в (14, 15, 16) group by vehicle_no)
Ответы
Ответ 1
Короткий ответ
В массиве config\database.php
→ "mysql"
Установите 'strict' => false
чтобы отключить все.
... или
Вы можете оставить 'strict' => true
и добавить режимы в "mysql"
в
'mysql' => [
...
....
'strict' => true,
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
]
Подробный ответ
Вам может не потребоваться отключить все строгие параметры... Пожалуйста, посмотрите на этот ответ об этой проблеме.
Ответ 2
Вероятно, это проблема SQL_MODE. В вашем config/database.php
, в соединении, измените
strict => false
Как в
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
Ответ 3
У меня тоже была эта проблема, но после изменения 'strict' => true
на 'strict' => false
, ошибка исчезла.
Вы можете найти этот параметр в:
Config\database.php
'mysql' => [
...
'strict' => false,
...
]
Ответ 4
Всякий раз, когда вы используете groupBy в красноречии, всегда включайте имя столбца, используемое в функции groupBy в функции select().
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
Также неверная практика - отключить строгий режим в файле конфигурации. Это может привести к тому, что поврежденные данные войдут в базу данных, такие как неверные даты, без каких-либо предупреждений. Не делайте этого, если это абсолютно необходимо.
Ответ 5
Без модификации файла config\database.php
Установка 'strict' => false
в config\database.php
может быть проблемой безопасности. Итак, простым решением Laravel может быть сначала вызов get()
а затем groupBy('vehicle_no)
:
$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');