ちいたんでアソシエーション

※クラスを更新しました。
続・ちいたんでアソシエーション
からダウンロードできますので、そちらをご利用ください。


開発ではもっぱら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対応で、相手方に関連キーがある場合に使います。
設定できる項目は以下 それぞれの項目は省略可能です。()は省略した場合の指定

関連付けるモデルクラス名を指定します。

  • conditions (null)

取得条件があれば指定します。

  • order (null)

ソート順があれば、設定します。(hasOneでは、複数件が抽出されても最上位の1件のみが返されます。)

  • foreignKey (このモデルのテーブル名 . "_id")

関連キー名を指定します。

hasMeny

1対多対応で、相手方に関連キーがある場合に使います。
設定できる項目は以下(hasOneにlimitの設定が増えるだけです。)

関連付けるモデルクラス名を指定します。

  • conditions (null)

取得条件があれば指定します。

  • order (null)

ソート順があれば、設定します。(hasOneでは、複数件が抽出されても最上位の1件のみが返されます。)

  • limit (null)

最大抽出件数

  • foreignKey (このモデルのテーブル名 . "_id")

関連キー名を指定します。

belongsTo

1対1対応で、自分に関連キーがある場合に使います。
設定できる項目は以下

関連付けるモデルクラス名を指定します。

  • conditions (null)

取得条件があれば指定します。

  • order (null)

ソート順があれば、設定します。(belongsToでは、複数件が抽出されても最上位の1件のみが返されます。)

  • foreignKey (classNameで指定したモデルのテーブル名 . "_id")

関連キー名を指定します。

hasAndBelongsToMany

リンクテーブルを用いてテーブルを連結する場合に使用します。

関連付けるモデルクラス名を指定します。

  • 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階層の深さまでアソシエーション情報を抽出します。

ダウンロード


追記:ちいたん公式サイトにリンクを張っていただきました。ありがとうございます。
こちらのコメント欄でバグの対応などしていきますので、よろしくお願いします。