CakePHP hasOne アソシエーション

CakePHPでhasOne アソシエーションを定義する。

1対1で対応するテーブルのアソシエーションの事をhasOneと定義します。
CookBookのuserテーブルはnameとpasswordだけですが、ここにメールアドレスや住所電話番号とかつけていくというのはなんとなくらしくないというか、汎用性が損なわれるような気がします。

なので、cookBookにもあるように’profiles’というテーブルを用意して、そこにフィールドを追加。user has profile とい関係性のテーブルを用意します。

参考サイト

アソシエーション: モデル同士を繋ぐ:hasOne CakePHP Cookbook v2.x documentation

profileテーブルを作成

テーブルを作ります。(cookBookとは違いますので、あしからず)

CREATE TABLE IF NOT EXISTS `profiles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`firstname` varchar(50) DEFAULT NULL,
`lastname` varchar(50) DEFAULT NULL,
`published` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

/app/Model/User.php に、User hasOne Profile というアソシエーションを定義

規約に沿っていて条件定義が必要でなければ、Profile.phpをbakeしてUser.phpにhasOneの定義をするだけです。

User.php


class User extends AppModel {
public $name = 'User';
public $hasOne = array('Profile');

規約外だったり詳細定義したい場合には、

<div>
<div>
<pre>class User extends AppModel {
    public $name = 'User';
    public $hasOne = array(
        'Profile' =&gt; array(
            'className'    =&gt; 'Profile',
            'conditions'   =&gt; array('Profile.published' =&gt; '1'),
            'dependent'    =&gt; true
        )
    );
}

という感じになります。
hasOneアソシエーションの配列に指定できるキーは以下の通りです。

  • className: 元モデルに関連付けられるモデルのクラス名。User hasOne Profile を定義したい場合、’Profile’となります。
  • foreignKey: アソシエーション先のモデルを検索するための外部キーの名前。これは複数のhasOneを定義するためによく使われます。このキーのデフォルト値は元モデルの単数形に _id がついたものです。上記のUserモデルの例では、user_id となります。
  • conditions: array('Profile.approved' => true) のような、find()に指定するconditionsと互換性のある配列、もしくはSQL文字列を指定します。
  • fields: アソシエーション先のモデルから取得するフィールドのリスト。デフォルトで全フィールドが含まれます。
  • order: array('Profile.last_name' => 'ASC') のような、find()に指定するorderと互換性のある配列、もしくはSQL文字列を指定します。
  • dependent: このキーにtureがセットされていて、かつモデルのdeleteメソッドのcascadeパラメータにtrueがセットされて呼び出された時、アソシ エーション先のモデルのレコードも一緒に削除されます。Userが削除されると、そのユーザーに関連するProfileも同時に削除したい場合にture にします。

このアソシエーションを定義すれば、Userモデルでfindした時に、関連するProfileが存在すればそのレコードも一緒に取得してくるようになります。

dependentが便利そう。です。アクセスコントロールはしっかりしておきましょう。

コメント

タイトルとURLをコピーしました