ちいたんでアソシエーション
※クラスを更新しました。
続・ちいたんでアソシエーション
からダウンロードできますので、そちらをご利用ください。
開発ではもっぱらCakePHPを使ってますが、
小さめの開発では、CakePHPを導入するのはちょっと大げさすぎたり、
mod_rewriteを使わずに、〜.phpでアクセスするようにしたい(というよりは、html作成先行型プロジェクトで、階層そのままで行きたい)場合などは、CakePHPを導入できなかったりします。
そんなときは、独自に簡易フレームワークを作ったり、(テンプレートパターン的なやつ)
ちいたんを利用したりします。
このちいたん。使い勝手がかなりいい。
開発者の方は、CakePHPを専ら使っているようで、CakePHPライクなのがまたいい。
でも、アソシエーションが無いんですよね。これ。
CakePHPでかなり便利なので、それが使えないとちょっと面倒なときがあり、
なんとかこの機能だけつけれないかなーと思索して、作っちゃいました。
ちいたんをダウンロードして、cheetan/model.phpを置き換えると、アソシエーションが使えるようになります。
MySQLでのみ確認してます。他はちょっと分かりません。Postgresってサブクエリ対応してたっけ?
ダウンロード
あ、アソシエーションってのは、
Userテーブルと、Profileテーブルがあって、
Userテーブルにprofile_idを持ってるとかで、関連があるテーブルの情報を一緒に引っ張ってくる機能です。
で、ほぼCakePHPと同じですが、
一応説明。
CakePHPのドキュメントも合わせて見るとよく分かると思います。
対応アソシエーションは以下の4つ。
- hasOne
- hasMeny
- belongsTo
- hasAndBelongsToMany
それぞれ、各モデルクラスに、同名のフィールドに連想配列で情報を設定できます。
↓こんな感じ。
var $hasOne = array('Profile' =>
array('className' => 'CProfile',
'conditions' => '',
'order' => '',
'foreignKey' => 'user_id'
)
);
最初の連想配列のキー(Profile)が結果の連想配列キーになります。ここにアソシエーションの情報が設定されます。
その値に当たる連想配列がProfileに対する設定。以下で詳しく説明。
hasOne
1対1対応で、相手方に関連キーがある場合に使います。
設定できる項目は以下 それぞれの項目は省略可能です。()は省略した場合の指定
- className ("C" . 連想配列キー)
関連付けるモデルクラス名を指定します。
- conditions (null)
取得条件があれば指定します。
- order (null)
ソート順があれば、設定します。(hasOneでは、複数件が抽出されても最上位の1件のみが返されます。)
- foreignKey (このモデルのテーブル名 . "_id")
関連キー名を指定します。
hasMeny
1対多対応で、相手方に関連キーがある場合に使います。
設定できる項目は以下(hasOneにlimitの設定が増えるだけです。)
- className ("C" . 連想配列キー)
関連付けるモデルクラス名を指定します。
- conditions (null)
取得条件があれば指定します。
- order (null)
ソート順があれば、設定します。(hasOneでは、複数件が抽出されても最上位の1件のみが返されます。)
- limit (null)
最大抽出件数
- foreignKey (このモデルのテーブル名 . "_id")
関連キー名を指定します。
belongsTo
1対1対応で、自分に関連キーがある場合に使います。
設定できる項目は以下
- className ("C" . 連想配列キー)
関連付けるモデルクラス名を指定します。
- conditions (null)
取得条件があれば指定します。
- order (null)
ソート順があれば、設定します。(belongsToでは、複数件が抽出されても最上位の1件のみが返されます。)
- foreignKey (classNameで指定したモデルのテーブル名 . "_id")
関連キー名を指定します。
hasAndBelongsToMany
リンクテーブルを用いてテーブルを連結する場合に使用します。
- className ("C" . 連想配列キー)
関連付けるモデルクラス名を指定します。
- conditions (null)
取得条件があれば指定します。
- order (null)
ソート順があれば、設定します。(hasOneでは、複数件が抽出されても最上位の1件のみが返されます。)
- limit (null)
最大抽出件数
- foreignKey (このモデルのテーブル名 . "_id")
関連キー名を指定します。
- joinTable (このモデルのテーブル名 . "_" . classNameで指定したモデルのテーブル名)
- associationForeignKey (classNameで指定したモデルのテーブル名 . "_id")
補足情報
$c->model->recursiveを設定することで、抽出する深さを決めることができます。
find,findallに先駆けて、
$c->model->recursive = 0;
としておくと、アソシエーション情報の抽出は完全にキャンセルされます。
$c->model->recursive = 2;
とすれば、2階層の深さまでアソシエーション情報を抽出します。
追記:ちいたん公式サイトにリンクを張っていただきました。ありがとうございます。
こちらのコメント欄でバグの対応などしていきますので、よろしくお願いします。