ECWorks Blog

ECWorks Blog

CakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。

【CakePHP】アソシエーションの図解

すみません。最近とっても忙しくて、更新どころではありませんでした。

予定していた連載も出来る状態ではなかったため、フェードアウト気味でした。まだちょっと出来るような状況ではないため、こちらの方はもうしばらくお待ちください。
それから、SmartyViewのアップデートもしなければならないのですが、こちらもなかなかアーカイブを作る暇が無く(というか、こちらの方はただ単に面倒くさくてやっていないだけだと思う(大汗))、まだ更新していません。ごめんなさい。近日中には上げます。

さて、本題にはいりますが…
今更なんですが、業務としてCakeを使い始めています。
安定性重視で1.1でやっていくつもりでいたのですが、1.2でも問題がなさそうなので(PostgreSQLを扱うために、bdo_source.phpだけはアップデートしています)、こちらの方で開発しています。
また、デザイン等を考慮する必要もないため、勉強も兼ねてSmartyViewは使わず純正でやっています。

だいぶCakeのことが分かってきたのですが、「アソシエーション」の基本的なことがイマイチ理解できていなかったのですが、図を書いてようやく分かりました。つまりこういうことだったのですね!

hasOneとhasManyは単数か複数かの違い、belongsToはhasOneの逆方向の意味だというのは何となく分かっていたのですが、hasAndBelongsToManyの意味が理解できなかったんです。上図の例でいくと、BookmarkとKeywordだけで、両方向から複数のつながりを表すのかと思っていたのですが、bookmark_keywordsという別テーブルを作ってそれぞれのidを定義することで双方向で複数形を表すんですね。Cakeを使う前も、もちろんこういう考え方はしていましたが、Cakeではテーブルさえ用意すれば、特にモデルで定義する必要はなく、BookmarkにKeywordを、KeywordにBookmarkをhasAndBelongsToMany定義するだけで動かすことが出来る、ということなんですね。

今回の案件ではbookmark_keywordsにも意味を持たせたかったりとか、登録方法が若干特殊なため、hasManyを双方向でかけているのですが、通常時では楽できそうです。

あとはバリデーションがうまく使いこなせるようになりたいです。
なんか1.1とやり方が変わっているみたいで、随時バリデートをかけながら登録するのなら問題ないのですが、まとめてバリデートをかけて、全部問題ないことを確認してから登録するような仕組みには使えなくなってしまったようなので、今回はとりあえずControllerのなかでチェックしてしまっています。この辺は1.1の仕様に戻して欲しいなぁ…




3 Comments

  1. こんにちは。ためになる記事ありがとうございます。(本(「〜辞典」)も購入いたしましたw)

    http://ecw.up.seesaa.net/image/association-thumbnail2.gif

    がリンク切れているようでしたので、再掲いただけると大変ありがたし、です。

  2. すみません。
    旧ブログを閉鎖した際に、画像のエクスポートがもれていたようです。
    また、本業の方が忙しくてすっかり対処を忘れていました。

    画像を貼り直しました。