unoh.github.com

簡単で見やすいKohanaのORM

Fri Jul 23 02:10:58 -0700 2010

こんにちは、6月にウノウに入社したj-nasuです。





入って一カ月でまさかウノウラボを書く事になるとは夢にも出てきませんでしたので、

自分の引き出しの少なさに絶望しています。



入社してからというもの、unohの技術レベルの高さに驚愕しながらも、

必死に食らいついていこうと、勉強させて頂いてる毎日です。

ウノウは今まで居た環境では知りえなかった知識や技を学べるので、

賢くなった気になって、とてもおめでたい感じになっています。

そしてメールでコードが五月雨に飛んでくるので、コード天国です。






というわけで、今回は簡単かつMVCモデルの入門にも最適なPHPフレームワーク
KohanaのORMを紹介したいと思います。






最初手を付けるなら、割と簡単で有名なCodeigniter(以下CI)というフレームワークの派生で、

(喧嘩別れという噂です)

ディレクトリ構成やデータの受け渡しもCIと似ています。

前職場に入社した際、でCIとCakeしか使った事が無かった私だったんですが、

そこの職場ではkohanaという聞き慣れないものを使っていると言われ、

英語が分からないのに英語のドキュメントしか無く、とても困惑した事を、

今でも鮮明に覚えています。






という事でkohana ORMです



>models/user.php<


class User_Model extends Base_Model
{
    protected $table_name='users';
    protected $primary_key='user_id';
    protected $table_columns=array(
        'user_id'=>'user_id',
        'category_id'=>'category_id',
        'status' =>'status',
        'type'   =>'type'
    );    
    protected $foreign_key=array('category_id');
    protected $has_one=array('user_profile'); //一対一のテーブル(モデル)を定義
    protected $has_many('user_item'); //一対多のテーブル(モデル)を定義
    const USER_STATUS_ACTIVE = 1;
    const USER_TYPE_ONE = 1;    
    //カラムのカプセル化
    public function get_user_id() {
        return $this->item_id;
    }
}



みたいなファイルをテーブルの数だけ増やしていきます。


>controllers/user.php<
//一件のレコードを取得
$user_model = new User_Model();
$user = $user_model->where(array('user_id'=>$user_id))->find();
$user_id = $user->get_user_id(); 
//複数のレコードを取得
$user_model = new User_Model();
$users = $user_model->where(array('status'=>User_Model::USER_STATUS_ACTIVE))->find_all();
//レコードをカウント
$user_model = new User_Model();
$users = $user_model->where(array('status'=>User_Model::USER_STATUS_ACTIVE))->count_all());
//クエリの連結
$user_model = new User_Model();
$user_model->where(array('status'=>User_Model::USER_STATUS_ACTIVE));
$user_model->where(array('type'=>User_Model::USER_TYPE_ONE));
$user_model->order_by('user_id','DESC');
$users = $user_model->find_all();



命名規則がウノウのコーディング規約から外れるので、ウノウでは使えないかも

しれませんが、find_allとか見たまんまなコードなので、MVC入門的な感じなら

使いやすいかもしれません。
ただし、2010年現在、ちゃんとしたドキュメントは英語しかありません。