결과를 가져 오기 위해 동일한 쿼리에서 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' => 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');
답변
웅변 적으로 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 BY
MySQL에서 사용할 때 .NET에서 사용되는 열의 각 값에 대해 하나의 행을 반환 하므로 의미가 있습니다 GROUP BY
. 따라서 선택한 행에있는 다른 열의 값은 어디에도 사용하기에 적합하지 않습니다. 따라서 항상 모범 사례를 사용하는 것이 좋으며 MySQL Strict Mode를 비활성화하지 않는 것이 좋습니다.
종종 개발자는 열 값으로 그룹화 된 쿼리 행이 필요할 수 있습니다. 여기에서는 열의 고유 한 값당 하나의 행만 필요하지 않습니다. 그러나 특정 열의 고유 한 값으로 그룹화 된 여러 행이 필요합니다. 어떤 이유로 그들은 groupBy
MySQL GROUP BY
쿼리 를 생성하는 Laravel의 Query Builder 메소드를 사용 하고 개발자는 위의 오류를 경험합니다.
그들의 문제에 대한 해결책은 groupBy
대신 Collection 메서드 를 사용 하는 것입니다. 예를 들면
$loadingData = DB::table('loading')
->whereIn('id', $loadIds)
->get()
->groupBy('vehicle_no');
이렇게하면 원하는 결과를 얻을 수 있습니다.