Posts tagged php5
CakePHP findBy での複数指定を調べたメモ
2先のエントリで書いた「CakePHP findBy で複数条件の指定で OR も指定可能」ですが、findByHogeAndFoo などの処理がどうなっているか気になったので調べたときのメモです。
- findByHogeAndFoo メソッドが実行されると model_php5.php ( Model クラス ) の __call メソッドが実行される
- __call メソッドでは DboSource クラスの query メソッドに findByHogeAndFoo のメソッド名と条件の値を渡す
- DboSource クラスの query メソッドでは、findBy または、findAllBy の後ろの文字列を取り出す
- 取り出した文字列を小文字に変換してさらに AND を _and_、OR を _or_ に変換する
- _or_ または _and_ で分割してフィールドを取り出す
- AND または OR にしたがって SQL の条件を組み立てる
というようなこと処理がされていました。
まとめると
- 複数指定はいくつでも可能
- AND または OR は混在して指定はできない
いくつでも指定はできるようですが、たくさんの条件をこれで指定するとソースの可読性が下がりそうですし、AND と OR が混在できないので普通はそんな指定はしないでしょう。
指定する場合は2つくらいにとどめておいて、それより多くなる場合は find の $conditions で指定した方が無難だと思います。
CakePHP findAll で INNER JOIN する方法
1開発中の CakePHP の案件でどうしても INNER JOIN する必要があり、かといって SQL を直接書くのは他のコンポーネントとの兼ね合いでできるだけ避けたい(というより無理)な状況だったので、絶対何か方法があるだろうと思いソースを調べたのでメモしておきます。
/cake/libs/model/model_php5.php の findAll メソッドに
$queryData = array('conditions' => $conditions, 'fields' => $fields, 'joins' => array(), 'limit' => $limit, 'offset' => $offset, 'order' => $order );
というのがあり、’joins’ に 空の配列を入れている。
この ‘joins’ の使い方を調べたら、
array( "type" => "INNER", "alias" => "", "table" => INNER JOIN するテーブル, "conditions" => INNER JOIN の ONに指定する条件, );
という配列を入れると INNER JOIN してくれるようです。
ただ、findAll の中で joins に空配列を入れているので、findAll を実行するときのパラメータに joins を指定しても無視されてしまう。
そこで、モデルの beforeFind メソッドを使用することにした。このメソッドは findAll の実行する前に呼ばれるメソッドです。
findAll を実行するモデルに次の beforeFind を定義
function beforeFind(&$queryData) { $queryData["joins"][] = array( "type" => "INNER", "alias" => "", "table" => "`model_name`", "conditions" => array("model_name.field=model_name2.field2"), ); return true; }
これで実行された SQL を確認すれば INNER JOIN されれいます。
CakePHP DISTINCT の使用方法
1cakebaker ? Using distinct and count with CakePHP
CakePHP で DISTINCT を使いたい時の方法が紹介されていました。
$this->User->find(null, "COUNT(DISTINCT User.city) AS 'count'");
find は /cake/libs/model/model_php5.php で
function find($conditions = null, $fields = null, $order = null, $recursive = null)
と定義されています。
この $fields をうまく使っているということですね。
いよいよ PHP5 への移行が進むか
0ついに来ましたか。。。2007/12/31いっぱいはサポートを続け、2008/08/08までは致命的なセキュリティFIXのみ行うようです。
最近の開発では PHP5 が増えてきましたし、いよいよPHP5 への移行が加速しそうですね。
個人的にはPHP5 は大歓迎です。
CakePHP SQL を書いて実行する方法
1CakePHP ではSQL を書かなくてもだいたいなんでもできるのですが、
ちょこっとSQLを書いて実行したいことがあり調べたメモです。
/cake/libs/model/model_php5.php
を眺めていると findBySqlメソッドがありました。
引数はSQLを文字列で受け取ります。
これだ!っと思ったらただ単に
function findBySql($sql) {
return $this->query($sql);
}
となっている。。。
queryメソッドにSQLを投げればいいんですね。
$sql = "SELECT NOW()";
$foo = $this->HogeModel->query($sql);