誕生日ポイントを自動で付与したいとか、思いつきで言われたので
会員情報検索で、~月が誕生日の人を探す
というのをどうしようかなーと思ってたんだけど
birthday は DATE 型。普通に大小で年月日比較してもどうしようもなくなるのでいろいろ考えた結果
LIKE節で月の部分だけマッチさせればいいという事にした。
CakePHP風に書くとこんな感じ
‘User.birthday LIKE’ => sprintf(‘____-%02d-__’ , $month ) ,
user.php 内の Class User
[PHP]
function getBirthMonthUser( $month = null ){
if( !is_numeric($month)){
$month = date(‘m’);
}
$options = array(
‘conditions’ => array(
‘User.birthday LIKE’ => sprintf(‘____-%02d-__’ , $month ) ,
),
‘order’ => array(
‘grade_id DESC’,
)
);
$this->recursive = 0;
$users = $this->find(‘all’ , $options);
//月日だけで並び替えるために月日だけの文字列を作る
foreach ($users as $key => $us){
$users[$key][‘User’][‘bdayStr’] = substr( $us[‘User’][‘birthday’] , -5);
}
//作った文字列で配列をソート
$sorted = Set::sort($users , ‘{n}.User.bdayStr’, ‘ASC’);
return $sorted;
}
[/PHP]
普通にデータ取ってくると、月日順で並んでない(order句を使っても「年」月日でしかソートされない)ので、
ちょっと雑なカラムを無理矢理作成して、 Set::sort を使って月日で並べ替えてから返してるよ!
Set ユーティリティはCakePHP の便利関数がまとまってるツール。
Set :: コアユーティリティライブラリ :: マニュアル :: 1.2コレクション :: The Cookbook
めんどくさそうな配列地獄をちょっとだけ見なかったことにしてくれる便利な奴。
挙動(というか使い方)がイマイチ謎な部分も多いけど、使えるものは使ってみよう。
controller からは $this->User->getBirthMonthUser( 10 ) ;
とかやると10月に誕生日なユーザがニュルっと引っ張れます。
絶対もっとスマートな方法があるはずだ・・・・