CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」の対処方法
CakePHP3特有の原因の解説と対処方法の紹介
CakePHP3でシステム開発を行っているときに発生したエラー。
SQLSTATE[23000]: Integrity constraint violation
SQLSTATE[42S22]: Column not found
このエラーの、CakePHP3の特有の原因の解説と対処方法を紹介します。
テーブルを指定しないと「Integrity constraint violation」のエラー
CakePHP3でシステム開発をする際によく記述する内容として、データベースから値を取得する処理があります。
contain句も書いていない、要素だけを取り出した内容になりますが、下記の様に find句と where句で条件を指定して値を取得します。
「view_flag」は、表示フラグで「1」となっているレコードを表示対象として表示するため、where句で条件を指定しています。
$this->DataSamples->find()->where(["view_flag"=>1])->all();
この処理を実行すると、下記のエラーが発生しました。
2019-01-01 01:01:01 Error: [PDOException] SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'view_flag' in where clause is ambiguous
contain句を書いていないため分かりにくいのですが、このエラーは、「アソシエーションのテーブルの中に『view_flag』というカラムが複数存在するため、カラムが特定できません(あいまいです)。」という内容です。
テーブルを指定すると「Column not found」のエラー
というわけで、「view_flag」に、テーブル名の「data_samples」を追加し「data_samples.view_flag」のようにしました。(下記のようにしました。)
$this->DataSamples->find()->where(["data_samples.view_flag"=>1])->all();
そうすると、今度は下記のエラーになりました。
2019-01-01 01:01:01 Error: [PDOException] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'data_samples.view_flag' in 'where clause'
これは比較的よく見かけるエラーです。
「指定のカラムがありません。」というものですね。
なので、テーブル名が間違っているのか、カラム名が間違っているのか、を目を皿のようにして見比べてみたり、テーブル名、カラム名を改めてコピペしてみたりするのですが、不具合は解消しないのです...
エラーの解消はテーブル名ではなく Model名を指定する!
なぜか!
テーブル名称の指定が間違っているからです。
実物のテーブル名は「data_samples」であったとしても、CakePHP3が Model(の tableファイル)を通じて認識しているテーブル名は「DataSamples」となるのです。
そのため、下記のように記述する必要があるのです。
$this->DataSamples->find()->where(["DataSamples.view_flag"=>1])->all();
よく行き当たるエラーではあるので、プログラム開発の質問サイトなどにもよく質問が投稿されているのですが、「[PDOException] SQLSTATE[42S22]: Column not found」というエラーなので、「カラム名が間違っていませんか?」という回答になってしまいがちなのです。
そのため、
不具合が解消しない!!!
のです...
というわけで、自分自身の備忘録も兼ねて記事を書きました。
同じところで引っかかっている方の助けになればいいなと思っています。
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
その他の「CakePHP3」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
-
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。
-
-
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
-
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。
-
-
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。
-
-
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。
-
-
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
CakePHPのバージョンの調べ方2点を紹介。CakePHP3~CakePHP5は共通だが CakePHP2はフォルダ構成が異なるためコマンドのパスもオプションも異なる。