CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
2019/06/08
CakePHP3でデータベースに値を保存する save()を実行するときのログを確認する方法
通常の save()実行ではエラーの情報が分からない
CakePHP3のシェルを利用してシステムを開発している際に、データを保存する save()を実行するところでエラーが発生していました。
ですが、save()処理の戻り値を取得しても、エラーである「False」が帰ってきているだけで、どのようなエラーが起こっているのかが分かりませんでした。
ブラウザで表示する処理を作っているのであれば、デバッグキットを利用して、エラーの原因を探ることもできますが、今回はシェルのプログラム開発をしていましたので、デバッグキットを利用する方法も採れませんでした。
と言うわけで、なんとかして「save()」を実行したときのエラーログを取得する方法を探したところ、それがありました。
通常は、下記の様に保存処理を記述します。
1 2 3 4 5 |
if($tableObject->save($saveData) === false) { return '500(Save Failed)'; } else { return '200(Save Success)'; } |
上記の方法では、save()の戻り値は、「true:正常終了」「False:エラー終了」のどちらかです。
エラーの場合は、どのようなエラーが出ているのかを確認する方法がありません。
そのため、エラーを確認するためには、下記の様に変更します。
1 2 3 4 5 6 7 8 |
try { $tableObject->saveOrFail($saveData); } catch (\Cake\ORM\Exception\PersistenceFailedException $e) { echo $e; // echo $e->getEntity(); return '500(Save Failed)'; } return '200(Save Success)'; |
「save()」を「saveOrFail()」に変更します。
それを「try ... catch 文」でエラーを取得します。
「echo $e;
」
を記述することで、エラーログを表示することができます。
上記のソースコード上ではコメントアウトしていますが、
「echo $e->getEntity();
」
を記述すると、保存しようとしたデータの実態(エンティティ)を表示することができます。
エラーログと保存しようとしたデータを確認しながら、エラーの原因を探ることができます。
参考サイト
CakePHP3 Cookbook 厳密な保存
https://book.cakephp.org/3.0/ja/orm/saving-data.html#id21
また、今回の記事では、データベースに値を保存する際のエラーを「try + catch 構文」を使って取得する方法ですが、保存処理をする前に事前にバリデーションを行って、その結果を取得する場合の処理については下記に記事を書いていますので参考にしてください。
CakePHP3で保存前にバリデーション結果を取得する2つの方法
Cake\ORM\Exception\PersistenceFailedException: Entity save failure (user_id: “_existsIn”, account_id: “_existsIn”).というエラーが出ていた
前項の対応を行ったところ、下記のエラーログが出力されました。
1 2 3 4 |
Cake\ORM\Exception\PersistenceFailedException: Entity save failure (user_id: "_existsIn", account_id: "_existsIn"). in /var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1945 Stack trace: #0 /var/www/html/src/Shell/GetUserShell.php(811): Cake\ORM\Table->saveOrFail(Object(App\Model\Entity\UserAccount)) (以下略) |
このエラーですが、「user_id: “_existsIn”, account_id: “_existsIn”」というところが大事なポイントです。
保存しようとしているデータに連携するはずの「user_id」「account_id」の値が、「users」「accounts」テーブルの中にありませんよ、というエラーです。
まだ開発をしている途中ですので、該当のテーブルのデータの保存の処理だけを作っていましたので、「users」「accounts」テーブルにはデータを入れていませんでした。
そのため、該当テーブル内にある「user_id」「account_id」の値がないので保存できません、というエラーでした。
エラーの原因が分かりましたので、「users」「accounts」テーブルに該当 IDのレコードを作成したところ、正しく保存することができるようになりました。
ちなみに、生の SQL文を直接実行する方法については下記に記事を書いていますので、合わせて参考にしてください。
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3の関連記事
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にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!
-
-
CakePHPを学ぶ際にはオブジェクト指向を学ぼう
CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!
-
-
CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」
CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。
-
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。