データを取得する
開発環境:CakePHP2.5.1
データを取得したい時に少し変わった条件で取得したい場合があります。
それぞれのやり方を見ていきましょう。
・同カラムに対してOR条件を指定する
・LIKE文であいまい検索
・◯以上や◯以下など<を使って検索
・◯以上◯以下の上下限値で取得
・カラムを別名(AS句)を付ける
・1カラムのみ取得
・findをスッキリさせるfindBy/findAllBy
・重複データを排除
・日付カラムを一部の条件で取得
・findをカスタマイズ
同カラムに対してOR条件を指定する
同じカラムをOR条件で取得したい場合は、下記のように配列を使って指定します。
<?php $params = array( 'conditions' => array( array( 'or' => array( array('status' => '1'), array('age' => '20'), ), ), array( 'or' => array( array('status' => '2'), array('age' => '40'), ), ), ), );
LIKE文であいまい検索
LIKE文を使うには次のようにします。
<?php $params = array( 'conditions' => array( 'name like' => '山田%', ), );
◯以上や◯以下など<を使って検索
2,000円以上のデータのみ取得する場合などは次のようにします。
<?php $params = array( 'conditions' => array( 'price >' => 2000, ), );
◯以上◯以下の上下限値で取得
特定の値の範囲でデータを取得したい時はbetweenを使用します。
<?php $params = array( 'conditions' => array( 'id between ? and ?' => array(10, 30), ), );
カラムを別名(AS句)を付ける
カラムを結合する場合などで別名を付けたい時の方法で、下記のようにすると、
<?php $params = array( 'fields' => array( 'CONCAT(User.first_name, " ", User.last_name) AS "User__name"', ), ); $data = $this->User->find('all', $params); ?>
結果は、
Array ( [0] => Array ( [0] => Array ( [User__name] => 山田 太郎 ) ) )
思ったような戻り値が得られません。
こんな時にはModelでVirtual fieldsを使います。
<?php public $virtualFields = array( 'name' => 'CONCAT(User.first_name, " ", User.last_name)' ); ?>
結果は、
Array ( [0] => Array ( [User] => Array ( [id] => 1 [first_name] => 山田 [last_name] => 太郎 [name] => 山田 太郎 ) ) )
countやsumを使う時のフィールド名を指定する場合もVirtual fieldsを利用します。
1カラムのみ取得
1つの項目のみ欲しい場合、fieldsパラメータでデータが欲しいカラムを指定することで取得することができますが、もっと簡単に取得するにはfieldメソッドを利用します。
<?php $this->User->id = 20; $name = $this->User->field('name');
findをスッキリさせるfindBy/findAllBy
複雑な条件ではない場合、$params変数にあれこれ書くとコードが膨れ上がってしまいます。
それを解消するために、1つのデータを取得する場合はfindBy、複数のデータを取得する場合はfindAllByを利用します。
<?php $data = $this->Sample->findByFlg(1);
これでsamplesテーブルのflgカラムが1のデータ一つが返されます。
複数のカラムの条件を付けたい場合はAndでつなぎます。
<?php $data = $this->Sample->findByFlgAndPrice(1, 1000);
これでsamplesテーブルのflgカラムが1かつpriceが1000のデータ一つが返されます。
条件以外にもfieldsやorderも下記の順番で渡すことで反映されます。
findBy
複数のデータを取得する場合のfindAllByも使い方は全く同じで、オプションとして下記の内容が増えます。
findAllBy
重複データを排除
重複したデータを排除するSQLを書くには、DISTINCTを付けますが、CakePHPでは次のようにfieldsの先頭にそのまま付けるだけでになります。
<?php $params = array( 'fields' => array( 'DISTINCT user_id', ), ); $data = $this->Sample->find('all', $params);
通常のfindであれば上記の方法でいいのですが、ページネーションを利用する場合には注意が必要です。
詳しくは「ページネーションではDISTINCTではなく、GROUP BYを使う」をご覧ください。
日付カラムを一部の条件で取得
日付データを持ったカラムで、今年のデータだけを抽出したい場合などは、次のように行います。
<?php $params = array( 'conditions' => array( 'posted like' => '2014%', ), ); $data = $this->Sample->find('all', $params);
このようにlike文を使ってもデータは取得できますが、日付の場合はもっと便利な関数が用意されていますので、そちらを利用しまよう。
例えばMySQLの場合は、次のようになります。
<?php $params = array( 'conditions' => array( 'date_format(posted, "%Y")' => '2014', ), ); $data = $this->Sample->find('all', $params);
“%Y”の部分は変更することで、月だけで指定したりすることもできます。
findをカスタマイズ
findを独自にカスタマイズさせたい時や、コントローラーをもっと整理させたい場合に使えるのが、findMethodsです。
詳しい使い方は「独自のfindを定義するfindMethods」をご覧ください。