mysqlのonly_full_group_by問題を解決するlaravelについて
次のコラムLaravelチュートリアルでは、laravelがmysを解決する方法を紹介します。 ql Only_full_group_by の問題。困っている友達のお役に立てれば幸いです。
MySQL 5.7 以降では、only_full_group_by がデフォルトで有効になり、より厳密な SQL 検出が行われ、次のエラーが報告されることになります
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'edu.t_sounds.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
方法はありませんこの問題を解決するには 回り道を避け、オンラインで見つかった方法に従って 1 つずつ試してください
解決策のアイデア
View sql_mode
select @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode
まず、mysql 設定ファイルを確認して変更します。my.cnf は非常に恥ずかしいです。my には ONLY_FULL_GROUP_BY がありません。クライアント設定に従って、[クライアント] 設定を追加します。
[mysqld]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
再起動mysql、MySQL ツールで sql_mode を確認すると、表示された結果は確かに設定と同じですが、プログラムは依然として同じエラーを報告します
もう一度検索した後、突然問題に気づきました。記事の先頭にある sql_mode をクエリする 2 つのステートメントであるグローバル セッションの違いについて質問しました。
mysql 変数の設定には 2 つの方法があります。 1 つはグローバル設定で、もう 1 つはグローバルです。 、全世界に作用します; 1 つはセッション構成セッションで、現在の接続にのみ作用します
それは起こりますか? 現在の接続に sql_mode を設定しているのは laravel ですconnection.
laravel プログラムが sql_mode[client]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
ログイン後にコピー を出力すると、それを設定したのはプログラムであることがわかります。
[client]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
最初のこと頭に浮かぶのは mysql 設定に厳密モードがあります。私は常にそれをオンにして false に設定しています。問題はスムーズに解決されました。
$result = \DB::select('SELECT @@GLOBAL.sql_mode'); print_r($result);exit; 结果: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION $result = \DB::select('SELECT @@SESSION.sql_mode'); print_r($result);exit; 结果: 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
これで問題は解決できますが、ベースになっています。テクノロジーについては、それがどのように書かれているかを知りたいだけであり、直接 false に設定したくありません。
- vendor/laravel/framework/src/ILLuminate で strict を検索してください。 /Database フォルダーを開き、コア コードを直接見つけます。ファイル:vendor/laravel/framework/src/ILLuminate/Database/Connectors/MySqlConnector.php
'strict' => false,
最初の判断は、存在するかどうかを直接決定します。モード設定。その場合は、これを使用してください
protected function setModes(PDO $connection, array $config){ if (isset($config['modes'])) { $this->setCustomModes($connection, $config); } elseif (isset($config['strict'])) { if ($config['strict']) { $connection->prepare($this->strictMode($connection))->execute(); } else { $connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute(); } }}
テストして、問題を直接解決してください
根本原因を探す精神で、次に読んでください。 on
Strict = trueの場合
ハードコーディングされたsql_mode、laravelはmysql 8.0.11を他のバージョンと区別します
'modes' => ['STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_pISION_BY_ZERO', 'NO_AUTO_CREATE_USER', 'NO_ENGINE_SUBSTITUTION'],
Then if strict = true false、sql_mode を NO_ENGINE_SUBSTITUTION に直接設定します
protected function strictMode(PDO $connection) { if (version_compare($connection->getAttribute(PDO::ATTR_SERVER_VERSION), '8.0.11') >= 0) { return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"; } return "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'"; }
問題はここで完全に解決されます
最終解決策
$connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
strict = true を維持し、mode オプションを追加します。内部のパラメータは次のとおりです。 laravel の基礎となる設定を削除しますが、ONLY_FULL_GROUP_BY
概要: 多くの回り道をし、多くの時間を費やした後、問題は最終的に解決され、何も変更する必要はありませんでした。 mysql
の設定以上がmysqlのonly_full_group_by問題を解決するlaravelについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

Laravel - ページネーションのカスタマイズ - Laravel には、ユーザーまたは開発者がページネーション機能を組み込むのに役立つページネーションの機能が含まれています。 Laravel ページネーターは、クエリ ビルダーおよび Eloquent ORM と統合されています。自動ページネーションメソッド

Laravelの電子メールの送信が失敗したときに戻りコードを取得する方法。 Laravelを使用してアプリケーションを開発する場合、検証コードを送信する必要がある状況に遭遇することがよくあります。そして実際には...

LaravelスケジュールタスクRAN RANSPONSIVEトラブルシューティングRALAVELのスケジュールタスクスケジューリングを使用すると、多くの開発者がこの問題に遭遇します。スケジュール:実行...

Laravelの電子メールの検証コードの送信の障害を処理する方法は、Laravelを使用することです...

DCATを使用するときにDCATADMIN(Laravel-Admin)にデータを追加するためにカスタムクリックのテーブル関数を実装する方法...

Laravel - ダンプサーバー - Laravel ダンプサーバーには、Laravel 5.7 のバージョンが付属しています。以前のバージョンにはダンプ サーバーが含まれていません。ダンプサーバーはlaravel/laravelコンポーザーファイルの開発依存関係になります。

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。
