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の関連記事
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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP 2.3 bakeの超初心者向けフォロー講座
CakePHP 2.3 bakeの超初心者向けフォロー講座
-
-
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。および、具体的なスクレイピングを実行するサンプルソースも。
-
-
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。
-
-
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。
-
-
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。
-
-
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
URL短縮サービス「TTTオンライン(https://ttt.onl)」を公開。メールやSNSでは使いにくい長いURLを短いURLに変換するサービス。QRコードも。Google URL Shortenerが2019年3月にサービス終了。
-
-
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。