RSS

model Tips その1

22 9月

ここ1ヶ月、2ヶ月で急激にcake1.3で開発をしています。
今年の初めから春先にかけても1.2で開発をしていましたが、その後はメンテナンスリリースだったり、デザイン面での改修が多かったので、改修もなかなかできず。社内の仕事が開発だけじゃないからサ…。

で、会社とは別に1.3系で開発をしているのですが、なんていうか、
・今までしらなかったのか!

みたいな事があります、あります。特に1.3系に特化した内容でもないので、「うわこいつ…いまさらこんなこといってんの?」的な生暖かい目でみてください。

1.モデルはチェーンできんだぞ?しってた?

Aモデルにアソシエーションを張っている場合それらのモデル(たとえばB)は、外部呼出しをせずともチェーン形式で呼び出しが可能。

たとえばコントローラー側では
$this->A->B->findAll();
等が可能。もちろんBのデータを全部取って来れます。(hasOneでもhasManyでもbelongsToでも)
※今までusesにいれるとか、Class::registryしてました……。
BがCとアソシエーションはっていれば、もちろん
Aのコントローラーから

$this->A->B->C->find();

とかくだけ。書くだけです。ちなみに、アソシエーション時に、エイリアスで別のクラス名(モデル名)を設定している場合は
そのエイリアスで呼ぶこと。そうじゃないと、無い!といわれます。

そうなってくると。ありそうなのはMailテーブルにfromとtoというフィールドを用意し、両方、ユーザIDが入ってるような場合は当然、fromとtoにbelongsToで設定したいところです。例として名前はFromUser,ToUserという名前にしてみます。

この場合、たとえば送信元のデータを取ってきたい場合はMailコントローラーで呼び出す場合

$this->Mail->FromUser->getDetail();

なんて呼び出しますよね。
その場合、モデルの方に検索するメソッドを実装するのですが、問題は、モデル名.フィールドで指定したい場合。実装するのはUserモデルに実装しますが、上記のような場合に呼び出される場合はFromUser.のような形で呼び出さないといけません。そんな時は

condtions =array(
 $this->alias.'.id' => $id ,
)

ように$this->alias.を使うことで、その際のモデル名を判断し、取得することが可能です。つまり、Userモデルのメソッドとしても利用できますし、FromUserとしても利用が可能になります。

広告
 
コメントする

投稿者: : 9月 22, 2010 投稿先 cakephp

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。