Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

cakephp1.2でqueryした時のエラーをキャッチしたい

cakephp->version:1.2.2.8120

cakephpのofficialではonError()なるコールバックメソッドがあると書いてあるが、こいつが呼び出されるのはfind,read,saveといったアソシエーション上で利用できるメソッドのみだった。libs/model/datasources/dbo_source.phpを追いかけたらそれがわかった。

もっと簡単に言えば、queryを使った時はonError()はコールバックされないってことだ!

これでうわーどうしようかなーと思ったが、DboSourceの親クラスであるDataSourceのメンバ変数にerrorなるものがあり、こいつはqueryを発行してもSQLエラーを格納してくれることが分かった。エラーになるSQL文をqueryに与えたらちゃんとエラーが格納されていた。というか、queryでもexecuteでもエラーをDboSourceが捕まえなかったらエラーメッセージも出せないはずだってことに気づいた。

なので、AppModelにDboの参照を持ってくるメソッドを用意して、こんな感じで拾ってみた。errorのデフォルトはnullで、エラーがあった時だけnullではなくなる。

<?php
 function getDbo() {
  	return ConnectionManager::getDataSource($this->useDbConfig);
  }
//各Modelはこうやって使う
//SQLエラーが発生したら
if($this->getDbo()->error !== null) {
 //ログ吐くなりcakeErrorするなりロールバックするなり
}

いじょ。