バーチャルフィールド(モデルの$virtualFields プロパティ)が便利。

CakePHP1.3から使えるモデルの$virtualFieldsプロパティを使ってみた。
ユーザーや会員のテーブルに『生年月日』を持っていて、『年齢』で検索したいときなんかにとっても便利。

mysql> desc members;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name        | varchar(32)      | NO   |     | NULL    |                |
| password    | varchar(32)      | NO   |     | NULL    |                |
| birthday    | date             | NO   |     | NULL    |                |
| created     | datetime         | NO   |     | NULL    |                |
| modified    | datetime         | NO   |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+


こんなテーブルのモデルに、バーチャルフィールドage(年齢)を設定。

<?php
class Member extends AppModel {
    var $name = 'Member';
    
    var $virtualFields = array(
        'age' => '(year(curdate()) - year(Member.birthday)) - (right(curdate(),5) < right(Member.birthday,5))'
    );
}


バーチャルフィールドageを使って、30歳以上の人を検索。

<?php

$this->data = $this->Member->find(
    'all',
    array(
        'conditions' => array(
            'Member.age >= ?' => 30,
        ),
    )
);

いやー、CakePHPは便利だなぁー。