web-dev-qa-db-ja.com

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:select * from loading id from(14、15、16)group by vehicle_no)

44

簡潔な答え

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'
        ],
 ]

詳細な回答

すべてのstrictオプションを無効にする必要はないかもしれません...この問題について answer をご覧ください。

98
Husam

これはおそらく 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,
],

私もこの問題を抱えていましたが、'strict' => true'strict' => falseに変更した後、エラーは消えました。

この設定は次の場所にあります。

config\database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
4
Zakhele

雄弁にgroupByを使用する場合は、常にselect()関数のgroupBy関数で使用される列名を含めます。

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

また、設定ファイルで厳格モードを無効にすることは悪い習慣です。これを行うと、警告なしで無効な日付などの破損したデータがデータベースに入力される可能性があります。

2
Thungdemo

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