Laravel : 구문 오류 또는 액세스 위반 : 1055 오류


89

결과를 가져 오기 위해 동일한 쿼리에서 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)


groupBy 및 whereIn 문 전환
aynber

그 작동하지 @aynber
Karthikvijayaveni

전체 오류 메시지를 인쇄 할 수 있습니까?
aynber

SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1055 'sbrtpt.loading.id'가 GROUP BY에 없습니다 (SQL : select * from loadingwhere idin (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

답변:


199

짧은 답변

으로 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
훌륭한 솔루션에 감사드립니다. 이 문제는 내 3 시간을 죽였습니다
Sarower Jahan 19

laravel의 오라클 연결에서이 엄격 모드를 어떻게 false로 설정할 수 있습니까? 제발 도와주세요
카스 차우

@VikasChauhan, 전에 Oracle을 사용하지 않아서 죄송합니다
Husam

2
이것은 효과가 있었다 !!! 해당 설정을 변경 한 후에도 동일한 오류가 계속 발생하는 경우 다음을 실행하여 구성 캐시를 지우십시오.php artisan config:cache
Altin

이런 종류의 하드 코딩 된 해결 방법에 대한 나의 우려는 밤에 잠을 잘 수 없게 만드는 일종의 기술적 부채를 느낀다는 것입니다. / 또는 MySQL 사양 변경 modes(예 : 해당 배열에 지정된 일부 모드의 추가 / 제거 또는 더 나쁜 경우에는 해당 배열에 지정된 모드 중 하나의 이름 변경). 그래서 나는 그냥 떠나고 strict=true아무것도 건드리지 않을 mode것입니다. 그런 엄격한 설정으로 작동하도록 코드를 업데이트하겠습니다. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

105

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

1
이 방법에서는 보안 문제 @Antonio 카를로스 리베 할 수 있습니다
Karthikvijayaveni

안전하다고 생각하거나 Laravel에서 비활성화 할 수있는 옵션이 없을 것입니다.
Antonio Carlos Ribeiro

7

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

'strict'=> false 일 때 적절한 결과를 얻지 못했습니다. 쿼리 할 때 그룹 데이터를 시도하면이 솔루션이 잘 작동합니다. 답변 감사합니다.
ireshan pathirana

6

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

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


-> select ( 'column') 추가가 저에게 효과적이었습니다. 감사합니다 친구 :)
Shaan

5

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

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

config \ database.php

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

laravel의 오라클 연결을 위해 어떻게 할 수 있습니까?
Vikas Chauhan

3

최신 정보 config/database.php

세트:

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

대신에:

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

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

php artisan config:cache

내가 당신에게 천 번 투표 할 수 있다면 2016 년에 답장을받는 것 외에. 캐시되는 단서없이 약 24 시간 동안 두드리는 것입니다. Love you man <3
Faisal Mehmood Awan

2

이 제한은 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');

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


0

추가 \Schema::defaultStringLength(191);boot방법

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         \Schema::defaultStringLength(191);
    }
}

0

다음을 사용할 수도 있습니다.

distinct ( 'vehicle_no')

groupBy ( 'vehicle_no') 대신 각 사례 시나리오가 다르지만 쿼리를 살펴보면 데이터를 집계하지 않기 때문에 distinct를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.