Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql

Tôi chỉ muốn tắt chế độ nghiêm ngặt MySQL cho một truy vấn bên trong bộ điều khiển không phải cho toàn bộ ứng dụng Laravel,

Tôi biết rủi ro của việc vô hiệu hóa chế độ nghiêm ngặt MySQL nên tôi không muốn vô hiệu hóa nó cho toàn bộ ứng dụng của mình từ config/cơ sở dữ liệu.php,

Tôi đang phải đối mặt với vấn đề chỉ với một truy vấn trong toàn bộ ứng dụng của mình, vì vậy tôi muốn vô hiệu hóa nó bên trong bộ điều khiển của mình trước khi chạy truy vấn đó chỉ trong một lần!

Xin hãy giúp tôi có cách nào cho tình huống đã cho.

hỏi ngày 26 tháng 7 năm 2018 lúc 8:25Jul 26, 2018 at 8:25

Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql

Mȍhǟmmǟd șamȋmmȍhmǟMǟd șamȋmMȍhǟmmǟd Șamȋm

Phim huy hiệu vàng 2311 Huy hiệu bạc13 Huy hiệu đồng1 gold badge4 silver badges13 bronze badges

5

Thay đổi chế độ nghiêm ngặt trong thời gian chạy

config()->set('database.connections.mysql.strict', false);
\DB::reconnect(); //important as the existing connection if any would be in strict mode
Model::select()->get(); // your query called in non strict mode

//now changing back the strict ON
config()->set('database.connections.mysql.strict', true);
\DB::reconnect();

Đã trả lời ngày 15 tháng 11 năm 2018 lúc 10:16Nov 15, 2018 at 10:16

Max Gauravmax GauravMax Gaurav

1.7652 huy hiệu vàng12 Huy hiệu bạc26 Huy hiệu đồng2 gold badges12 silver badges26 bronze badges

2

Sử dụng cái này cho MySQL ≤5.7 (lấy từ đây):

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");

Đã trả lời ngày 26 tháng 7 năm 2018 lúc 15:14Jul 26, 2018 at 15:14

Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql

Jonas Staudenmeirjonas StaudenmeirJonas Staudenmeir

23.7K5 Huy hiệu vàng57 Huy hiệu bạc102 Huy hiệu Đồng5 gold badges57 silver badges102 bronze badges

6

Một điều mà bạn có thể làm là thay đổi giá trị này trong thời gian chạy

public function doQueryWithoutStrictMode{
    config('database.connections.mysql.strict', false);
    DB::select('The query you want to make, and that should work!');

    And then, if you later want to do another query in strict mode withing the same 
    method you can enable it like this.

    config('database.connections.mysql.strict', true);

    DB::select('your other query with strict mode');

}

Đã trả lời ngày 26 tháng 7 năm 2018 lúc 15:37Jul 26, 2018 at 15:37

jarguez01jarguez01jarguez01

Huy hiệu đồng 1941 Bạc7 Huy hiệu đồng1 silver badge7 bronze badges

2

Trong config/database.php, làm như:

'Kết nối' => [

    'mysql' => [

        // Behave like MySQL 5.6

        'strict' => false,

        // Behave like MySQL 5.7
        'strict' => true,
    ]

]

Đã trả lời ngày 26 tháng 7 năm 2018 lúc 9:31Jul 26, 2018 at 9:31

1

MySQL đã có một chế độ nghiêm ngặt kể từ 5.1, nhưng trong 5.7, nó đã trở thành mặc định. Nếu bạn đã tạo ra một máy chủ gần đây và đột nhiên các ứng dụng của bạn đã bị hỏng, đây có thể là nguồn.

Trong Laravel, bạn có thể sửa lỗi này trong mã: Chỉnh sửa tệp database.php của bạn và thêm khóa là strict với giá trị là false. Nhưng nếu bạn đang sử dụng một ứng dụng không phải là LARAVEL (chúng tôi đã gặp phải điều này với cả ứng dụng Codeigniter và CraftCMS), bạn sẽ không có tùy chọn đó. Đây là cách vô hiệu hóa chế độ nghiêm ngặt trên toàn cầu trên bất kỳ máy chủ Laravel Forge nào (và bất kỳ máy chủ Ubuntu nào khác).

Lưu ý: Tôi không ủng hộ việc vô hiệu hóa chế độ nghiêm ngặt. Các chế độ mới này cung cấp các lợi ích tốc độ và tính nhất quán đáng để giữ cho chúng được bật. Tôi muốn cung cấp cho bạn các tùy chọn trong trường hợp bạn cần chúng, nhưng khuyến nghị của tôi là giữ cho chúng được bật và học cách làm việc với chúng.

Tệp cấu hình của bạn

MySQL thực sự trông năm địa điểm khác nhau cho các tệp cấu hình, vì vậy bạn có thể thực hiện thay đổi tôi sắp đề xuất một số nơi. Nó sẽ nhìn vào ____9,

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
0,
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
1,
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
2 và
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
3.
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
4 là dành riêng cho người dùng và các tùy chọn thứ ba và thứ tư dựa vào các chi tiết cụ thể từ môi trường của bạn. Vì vậy, hãy gắn bó với một trong hai cái đầu tiên.

Trên hộp Laravel Forge mặc định, cấu hình MySQL mặc định sẽ tồn tại trong

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
0, vì vậy hãy đặt các thay đổi của chúng tôi ở đó. SSH vào máy chủ của bạn và sử dụng VIM hoặc PICO để chỉnh sửa tệp đó.

Dòng của bạn

Nếu bạn cuộn xuống tệp một chút, bạn sẽ tìm thấy phần

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
6. Chúng tôi sẽ thêm một khóa mới,
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
7. Trên MySQL 5.7, các giá trị mặc định cho khóa này ra khỏi hộp là:

STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Chế độ nghiêm ngặt đến từ

DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
8. Vì vậy, hãy ghi đè lên
DB::statement("set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
// your query
DB::statement("set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");
7 và đặt nó giống như mặc định, nhưng không có chế độ nghiêm ngặt.

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Đó là nó! Lưu tệp và khởi động lại MySQL. Từ dòng lệnh sẽ là

public function doQueryWithoutStrictMode{
    config('database.connections.mysql.strict', false);
    DB::select('The query you want to make, and that should work!');

    And then, if you later want to do another query in strict mode withing the same 
    method you can enable it like this.

    config('database.connections.mysql.strict', true);

    DB::select('your other query with strict mode');

}
0 hoặc từ giao diện Laravel Forge, mở máy chủ, nhấp vào biểu tượng dịch vụ khởi động lại ở phía dưới và chọn khởi động lại MySQL.

Lưu ý: Nếu bạn đang sử dụng CraftCMS hoặc một số phiên bản nhất định của Laravel, bạn có thể cũng muốn vô hiệu hóa tùy chọn "Only_full_group_by".

Share:

Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql
Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql
Hướng dẫn laravel disable mysql strict mode - laravel vô hiệu hóa chế độ nghiêm ngặt mysql

Bình luận? Tôi là @stauffermatt trên Twitter

Chế độ nghiêm ngặt có được kích hoạt không?

Kích hoạt và vô hiệu hóa chế độ nghiêm ngặt trong Laravel 5.2 với tính năng mới này, giờ đây Laravel có khả năng thực hiện ba điều: vô hiệu hóa chế độ "nghiêm ngặt", trở lạienable "strict" mode, setting it to the 5.7 behavior; or customizing exactly which modes are enabled.

Điều gì là nghiêm ngặt ở Laravel?

· Theo dõi.Hãy tuyệt vời những điều mới trong bản phát hành Laravel tuần này.Đầu tiên, bây giờ bạn có thể nhanh chóng kích hoạt "Chế độ nghiêm ngặt": Không có ngoại lệ tải lười biếng khi gán các thuộc tính không có thể lấp đầy các ngoại lệ truy cập các thuộc tính không được truy xuất hoặc không tồn tại.No lazy loading Exceptions when assigning non-fillable attributes Exceptions accessing attributes that weren't retrieved or don't exist.

Làm thế nào tôi có thể biết nếu MySQL nghiêm ngặt?

Đầu tiên, hãy kiểm tra xem chế độ nghiêm ngặt có được bật hay không trong MySQL bằng cách sử dụng:..
Hiển thị các biến như 'SQL_Mode' ;.
Đặt sql_mode = '';.
Đặt sql_mode = 'strict_trans_tables' ;.