[php] 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’is not in GROUP BY (SQL : select * from loading where id in (14, 15, 16) group by vehicle_no)



답변

짧은 답변

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

자세한 답변

모든 엄격한 옵션 을 비활성화 할 필요는 없습니다 .이 문제에 대한이 답변을 살펴보십시오 .


답변

이것은 아마도 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,
],


답변

config \ database.php 파일을 수정하지 않고

설정'strict' => falseconfig\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');


답변

웅변 적으로 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')

또한 구성 파일에서 엄격 모드를 비활성화하는 것은 나쁜 습관입니다. 이렇게하면 경고없이 잘못된 날짜와 같은 손상된 데이터가 데이터베이스에 입력 될 수 있으므로 절대적으로 필요한 경우가 아니면하지 마십시오.


답변

이 문제도 겪고 있었지만 'strict' => true,을로 변경 한 후 'strict' => false오류가 사라졌습니다.

이 설정은 다음에서 찾을 수 있습니다.

config \ database.php

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


답변

최신 정보 config/database.php

세트:

'mysql' => [
           'strict' => false,
        ],

대신에:

'mysql' => [
           'strict' => true,
        ],

캐시를 지우는 것을 잊지 마십시오.

php artisan config:cache


답변

이 제한은 GROUP BYMySQL에서 사용할 때 .NET에서 사용되는 열의 각 값에 대해 하나의 행을 반환 하므로 의미가 있습니다 GROUP BY. 따라서 선택한 행에있는 다른 열의 값은 어디에도 사용하기에 적합하지 않습니다. 따라서 항상 모범 사례를 사용하는 것이 좋으며 MySQL Strict Mode를 비활성화하지 않는 것이 좋습니다.

종종 개발자는 열 값으로 그룹화 된 쿼리 행이 필요할 수 있습니다. 여기에서는 열의 고유 한 값당 하나의 행만 필요하지 않습니다. 그러나 특정 열의 고유 한 값으로 그룹화 된 여러 행이 필요합니다. 어떤 이유로 그들은 groupByMySQL GROUP BY쿼리 를 생성하는 Laravel의 Query Builder 메소드를 사용 하고 개발자는 위의 오류를 경험합니다.

그들의 문제에 대한 해결책은 groupBy대신 Collection 메서드 를 사용 하는 것입니다. 예를 들면

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

이렇게하면 원하는 결과를 얻을 수 있습니다.