Laravel: Lỗi cú pháp hoặc vi phạm quyền truy cập: Lỗi 1055


89

Tôi muốn sử dụng WhereIn và Groupby trong Same Query để tìm nạp Kết quả.

Tôi đã thử cái này:

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

Nhưng tôi nhận được thông báo lỗi này:

SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm quyền truy cập: 1055 'sbrtpt.loading.id' không nằm trong GROUP BY (SQL: select * from loading where id trong (14, 15, 16) group by Vehicle_no)


Chuyển sang câu groupby và trong đó bạn xung quanh
aynber

Nó không hoạt động @aynber
Karthikvijayaveni

Bạn có thể in thông báo lỗi đầy đủ của mình không?
aynber

SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm quyền truy cập: 1055 'sbrtpt.loading.id' không nằm trong GROUP BY (SQL: select * từ loadingvị trí idtrong (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

Câu trả lời:


199

Câu trả lời ngắn

Trong config\database.php-> "mysql"mảng

Đặt 'strict' => falseđể tắt tất cả.

.... hoặc là

Bạn có thể để lại 'strict' => truevà thêm các chế độ vào "mysql"tùy chọn trong

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

Câu trả lời chi tiết

Bạn có thể không cần phải tắt tất cả các tùy chọn nghiêm ngặt ... Vui lòng xem câu trả lời về vấn đề này.


2
Cảm ơn vì một giải pháp tuyệt vời. vấn đề này đã giết chết 3 giờ của tôi
Sarower Jahan

Làm cách nào chúng ta có thể đặt chế độ nghiêm ngặt này thành false trên kết nối oracle trong laravel? Xin hãy giúp tôi
Vikas Chauhan

@VikasChauhan, Xin lỗi, tôi đã không sử dụng Oracle trước đây
Husam

2
Điều này đã làm việc !!! Đối với bất cứ ai vẫn nhận được lỗi tương tự sau khi thay đổi thiết lập đó, hãy thử xoá bộ nhớ cache cấu hình bằng cách chạyphp artisan config:cache
Altin

Mối quan tâm của tôi về loại giải pháp được mã hóa khó này là tôi cảm thấy một thứ nợ kỹ thuật nào đó sẽ không khiến tôi ngủ ngon vào ban đêm, bởi vì loại câu hỏi sẽ lởn vởn trong đầu tôi sẽ như: điều gì sẽ xảy ra khi Laravel và / hoặc MySQL spec thay đổi wrt modes(ví dụ: thêm / xóa một số chế độ được chỉ định trong mảng đó, hoặc tệ hơn nữa, tên của một trong các chế độ được chỉ định trong mảng đó thay đổi). Vì vậy, tôi chỉ để lại strict=truevà không đụng vào bất cứ modethứ gì. Tôi thà cập nhật mã của mình để hoạt động với cài đặt nghiêm ngặt như vậy. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

105

Đây có thể là sự cố SQL_MODE . Trong của bạn config/database.php, trong kết nối, thay đổi

strict => false

Như trong

'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
Trong phương pháp này có thể thực hiện bất kỳ vấn đề bảo mật @Antonio Carlos Ribeiro
Karthikvijayaveni

Tôi tin rằng nó an toàn hoặc bạn sẽ không có tùy chọn trên Laravel để tắt nó.
Antonio Carlos Ribeiro

8

Không cần sửa đổi tệp config \ database.php

Đặt'strict' => false trong config\database.phpcó thể là một vấn đề bảo mật . Vì vậy, một giải pháp Laravel đơn giản có thể là cuộc gọi đầu tiên get()và sau đógroupBy('vehicle_no) :

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

Tôi không thể nhận được kết quả thích hợp khi 'nghiêm ngặt' => sai. thì giải pháp này hoạt động tốt nếu bạn thử dữ liệu nhóm khi truy vấn. Cảm ơn bạn đã trả lời.
ireshan pathirana

6

Bất cứ khi nào sử dụng groupBy một cách hùng hồn, hãy luôn bao gồm tên cột được sử dụng trong hàm groupBy trong hàm select ().

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

Ngoài ra, việc tắt chế độ nghiêm ngặt trong tệp cấu hình là một việc làm không tốt. Làm như vậy có thể khiến dữ liệu bị hỏng xâm nhập vào cơ sở dữ liệu chẳng hạn như ngày tháng không hợp lệ mà không có bất kỳ cảnh báo nào. Đừng làm vậy trừ khi thực sự cần thiết.


Bổ sung -> select ('column') phù hợp với tôi. Cảm ơn bạn thân :)
Shaan

5

Tôi cũng gặp sự cố này nhưng sau khi thay đổi 'strict' => true, 'strict' => falselỗi đã biến mất.

Bạn có thể tìm thấy cài đặt này trong:

config \ database.php

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

Làm thế nào chúng ta có thể làm điều đó cho oracle connectiion trong laravel
Vikas Chauhan

3

cập nhật config/database.php

bộ:

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

thay vì:

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

và đừng quên xóa bộ nhớ cache:

php artisan config:cache

bên cạnh việc được trả lời vào năm 2016 nếu tôi có thể bỏ phiếu cho bạn một nghìn lần tôi sẽ. đập với nó khoảng 24 giờ mà không có bất kỳ manh mối nào của nó được lưu vào bộ nhớ cache. Love you man <3
Faisal Mehmood Awan

2

Hạn chế này có ý nghĩa như khi bạn sử dụng GROUP BYtrong MySQL, nó trả về một hàng cho mỗi giá trị trong các cột được sử dụng trong GROUP BY. Vì vậy, giá trị của các cột khác trong các hàng đã chọn không có ý nghĩa khi sử dụng ở bất kỳ đâu. Vì vậy, bạn nên sử dụng phương pháp hay nhất và tôi khuyên bạn không nên tắt Chế độ nghiêm ngặt của MySQL.

Thông thường các nhà phát triển có thể cần các hàng của một truy vấn được nhóm theo giá trị của một cột. Ở đây, chúng không cần chỉ một hàng cho mỗi giá trị duy nhất của các cột. Nhưng chúng cần nhiều hàng được nhóm theo các giá trị duy nhất của một cột cụ thể. Vì một số lý do, họ sử dụng groupByphương thức Query Builder của Laravel để tạo ra một GROUP BYtruy vấn MySQL và các nhà phát triển gặp phải lỗi trên.

Giải pháp cho vấn đề của họ là sử dụng groupByphương pháp Collection. Ví dụ,

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

Điều này sẽ cung cấp cho họ kết quả mong muốn.


0

thêm \Schema::defaultStringLength(191);vào bootphương pháp

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

Bạn cũng có thể sử dụng:

khác biệt ('xe_no')

thay vì groupBy ('xe_no') mỗi trường hợp khác nhau, nhưng nhìn vào truy vấn của bạn, khác biệt có thể là cách tốt nhất vì bạn không tổng hợp dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.