エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説

      2019/06/08

CakePHP3でデータベースに値を保存する save()を実行するときのログを確認する方法

 

通常の save()実行ではエラーの情報が分からない

 
CakePHP3のシェルを利用してシステムを開発している際に、データを保存する save()を実行するところでエラーが発生していました。
 
ですが、save()処理の戻り値を取得しても、エラーである「False」が帰ってきているだけで、どのようなエラーが起こっているのかが分かりませんでした。
 
 
ブラウザで表示する処理を作っているのであれば、デバッグキットを利用して、エラーの原因を探ることもできますが、今回はシェルのプログラム開発をしていましたので、デバッグキットを利用する方法も採れませんでした。
 
と言うわけで、なんとかして「save()」を実行したときのエラーログを取得する方法を探したところ、それがありました。
 
 
通常は、下記の様に保存処理を記述します。
 

 
上記の方法では、save()の戻り値は、「true:正常終了」「False:エラー終了」のどちらかです。
エラーの場合は、どのようなエラーが出ているのかを確認する方法がありません。
 
そのため、エラーを確認するためには、下記の様に変更します。
 

 
「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”).というエラーが出ていた

 
前項の対応を行ったところ、下記のエラーログが出力されました。
 

 
このエラーですが、「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の関連記事

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法

CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。

CakePHP3のユーザ管理・認証プラグイン CakeDC/Usersの導入・機能解説・3.1.5対応
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応

CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装

CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点

ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。

CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定

CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。

CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」

CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。

CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で前方一致検索、後方一致検索、不等号による検索、between句による範囲検索の解説です。

CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能

CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。

CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法

CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。