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');