CakePHP

CakePHPでDBのExceptionが起こった時にどういうSQLを投げたためかをログに吐く

何か変なqueryをMySQLに投げてしまって 2012-05-26 18:23:21 Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`user_logs`, CONSTRAINT `user_logs_ibfk_1` FOREI…

CakePHPでwhere句のINの並び順で結果をsortしたいときはORDER BY FIELDを使う

where句のINの並び順で結果をsortしたいときはORDER BY FIELDを使うの続きfindのorderの所で array('FIELD(Country.id, 4, 1, 5, 3, 6, 2)')) と書けばいい。 参照 http://cakebaker.42dh.com/2008/06/10/order-by-field/ Ok, let’s do some examples to le…

findで複数のORを使う場合はarrayで囲む

CakePHPでfind使うとき SELECT * FROM t WHERE "id" = '1' AND (("status" = '1') OR ("flg" = '1')); というSQLが書きたければ find('find', array( 'conditions' => array( 'id' => 1, 'OR' => array( 'status' => 1, 'flg' => 1, ), ), )); みたいな感じ…

bindModelで別のモデルを関連づけてsaveAllする際、isUniqueのバリデーションルールのせいでsave()できない場合は第2引数にfalseをセットする

タイトルの通りですがsaveAll()で保存に失敗してハマったのでメモ。 流れは以下のような感じ ModelA hasMany ModelB ModelBはModelAのキーであるmodel_a_idをもつ(外部キーがmodel_a_id) ModelA->saveAll()を使ってModelAとModelBの両方を同時に保存したい…

hasManyなどで関連づけたテーブルにシーケンスがない場合のsaveAll

以下のようにCakePHPのCookbookに関連したテーブルへの保存方法が載ってますが、 PostgreSQLのシーケンス部分でハマってしまったのでメモ。 saveAll(array $data = null, array $options = array())次のいずれかの目的で使用します。 (a) 単一のモデルに、個…

findするときのconditionsなどにモデル名を書く習慣を付ける

CakePHPのCookbookを読んでると、いろんなところで「SQL内にモデル名を含めましょう」みたいなことが書いてあります。 conditions: 関連モデルのレコードを限定するための SQL。SQL 内でモデル名を使用することを習慣にしておくようにしておきましょう:“appr…

CakePHPで「create時は必須入力」「update時は任意入力」のvalidationをする

CakePHPでDBにデータを保存するときにはmodelの$validate変数を使ってバリデーションをすると思うのですが、 ちょっとやり方がわからなくてハマった所があったのでメモ。 前提 簡単に話を進めるためにtitleとstatusというカラムをもつテーブルがあったと仮定…

CakePHPのfindで複数のカラムのDISTINCT

CakePHPのfindメソッドで複数のカラムのDISTINCTを実行したいなと思いcookbookを確認したのですが、 サンプルには1カラムのものしかない。 DISTINCT クエリを用いた簡単な例は次のようになります。MIN() や MAX()、その他の演算子も、同じように扱えます。 a…

CakePHPのバリデーションルールにマジックナンバーを使わないようにするためどこに定数をまとめるか

「最小文字数が8」っていうバリデーションルールを書く例で Cookbookだと下のような感じでマジックナンバーにしてある。 'rule' => array('minLength', '8'), 多分簡単に説明するためにマジックナンバーにしてあるんだろうけど、 実際に開発するときは作用み…

find('prevnext')とか作ってたけど、find('neighbors')があった

またCakePHP。 リストのひとつを選んだときに、その前後の要素をページングとして表示したかったので、 $total = parent::find('count', $options); $prev = ($id === 1) ? null : parent::find('first', array_merge( array( 'conditions' => array('id' =>…

CakePHP1.3で$this->pageTitleは使えない

久々にphpの勉強を兼ねて、昨日から何となくCakePHPを触りだしました。ちょっと楽しい。 で、本題。 app/views/layouts/default.ctp(cake/libs/view/layouts/default.ctpからコピー)に$title_for_layout;というのがあり、それを設定するためにcontrollerで…