Welcome to the Cookbook

loading...

3.7.6.3 belongsTo

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

ここでは、User モデルから Profile のデータにアクセスします。User のデータに関連したデータにアクセスするために Profile モデルに belongsTo 関連を定義します。belongsTo 関連は、自然に hasOne や hasMany 関連の対になります: 他の方向からデータをみることができます。

データベースのテーブルに belongsTo 関係のためのキーを作成するには、次のような規則になります:

belongsTo: 現在の モデルが外部キーをもちます
関係 スキーマ
Banana belongsTo Apple bananas.apple_id
Profile belongsTo User profiles.user_id
Mentor belongsTo Doctor mentors.doctor_id

モデル(テーブル)が外部キーを持つ場合、そのモデルは他のモデル(テーブル)に属します。

次のような構文を使用して、/app/models/profile.php 内で Profile モデルに belongsTo 関連を定義することができます:

<?php

class Profile extends AppModel {
    var $name = 'Profile';                
    var $belongsTo = 'User';   
}
?>
  1. <?php
  2. class Profile extends AppModel {
  3. var $name = 'Profile';
  4. var $belongsTo = 'User';
  5. }
  6. ?>

配列を使用してより詳細な関係を定義することもできます。

<?php

class Profile extends AppModel {
    var $name = 'Profile';                
    var $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'    => 'user_id'
        )
    );  
}
?>
  1. <?php
  2. class Profile extends AppModel {
  3. var $name = 'Profile';
  4. var $belongsTo = array(
  5. 'User' => array(
  6. 'className' => 'User',
  7. 'foreignKey' => 'user_id'
  8. )
  9. );
  10. }
  11. ?>

belongsTo 関連の配列で有効なキーは以下のようになります:

  • className: 現在のモデルに関連したモデルのクラス名。‘Profile belongsTo User’ という関係を定義する場合、className キーは‘User’になります。
  • foreignKey: 現在のモデルにある外部キー名。複数の belongsTo 関係を定義する必要がある場合に、これは特に便利です。このキーのデフォルト値は、他のモデル名のアンダースコアで区切られた単数形で、末尾に‘_id’が付きます。
  • conditions: 関連モデルのレコードを限定するために使用する SQL。SQL にモデル名を使用するのは良い習慣となります: “User.active = 1” は常に“active = 1”よりも推奨されます。
  • fields: 関連モデルのデータを取得した際に取り出すフィールドのリスト。デフォルトではすべてのフィールドを返します。
  • counterCache: (bool) true にセットすると、save() または delete() が呼び出されるたびに、関連モデルは自動的に外部テーブルの“[singular_model_name]_count”というフィールドをインクリメントまたはデクリメントします。カウンタフィールドの値は関連する行の番号を表します。

この関連が定義されると、Profile モデルの find 操作は、存在する場合は関連する User レコードを取得するでしょう:

//Sample results from a $this->Profile->find() call.

Array
(
   [Profile] => Array
        (
            [id] => 12
            [user_id] => 121
            [skill] => Baking Cakes
            [created] => 2007-05-01 10:31:01
        )    
    [User] => Array
        (
            [id] => 121
            [name] => Gwoo the Kungwoo
            [created] => 2007-05-01 10:31:01
        )
)