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句で条件を指定しています。
|
1 |
$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」のようにしました。(下記のようにしました。)
|
1 |
$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」となるのです。
そのため、下記のように記述する必要があるのです。
|
1 |
$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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
-
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でCSVファイルをアップロードしレコードを追加、更新する処理の作成方法の解説。モデルとは直接関連しないフォームからCSVファイルをアップロードするため汎用的に使用可能。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP 2.3で saveの便利な使い方・サンプルソース付き
CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!
-
-
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。