LoginSignup
21
26

More than 5 years have passed since last update.

【CakePHP】アソシエーション

Last updated at Posted at 2014-09-24

has many

主キーが外部参照されている場合。
(デフォではidが主キーとなるが、primaryKeyで変更も可能。)

定義

直接モデルへまたはbindModelで動的に設定する。
find()などで余計なSQLが流れないよう動的に設定するのが推奨。

モデルへ定義する例
class User extends AppModel{
  public $hasMany = ['Comment'];
}

※bindModelは後述。

取得結果

自身のテーブルと、それに紐づくレコードがひとまとまりで取得されるので単にjoinするよりあとの処理が楽。

(
  [User] => Array
    (
      [id] => 121
      [name] => Gwoo the Kungwoo
      [created] => 2007-05-01 10:31:01
    )
  [Comment] => Array
    (
      [0] => Array
        (
          [id] => 123
          [user_id] => 121
          [title] => On Gwoo the Kungwoo
          [body] => The Kungwooness is not so Gwooish
          [created] => 2006-05-01 10:31:01
        )
      [1] => Array
        (
          [id] => 124
          [user_id] => 121
          [title] => More on Gwoo
          [body] => But what of the Nut?
          [created] => 2006-05-01 10:41:01
        )
    )
)

実行されるSQL

joinではなく自身のテーブルへSQLが発行された後、アソシエーション先へのSQLが実行される。そのため、パフォーマンスに問題あり。自身のテーブルでヒットするレコード数が多い場合は、joinを検討する。

オプション

$hasMany = array(
  'Comment'=>array(
    'foreignKey'=>'user_id',//アソシエーション先の外部キー。省略時、小文字のモデル名+id。
    'fields'=>['title','body'],//アソシエーション先の取得フィールド
    'className'=>'Comment',//アソシエーション先のモデル名
    'conditions'=>['del_flg'=>true],//アソシエーション先のフィルタ条件
    'order'=>array('created'),//アソシエーション先のorder条件
    'dependent'=>false,//trueにすると、紐づくアソシエーション先のレコードも削除する。
    'exclusive'=>false,//true に設定すると、関連しているすべてのオブジェクトが一つの SQL ステートメントで削除される。
    'finderQuery'=>''//アソシエーションを取り出すために、完全な SQL ステートメントを指定する。?
    'limit'=>2//アソシエーション先のlimit条件
  )

belongs to

他のテーブルへ外部参照する。

定義

直接モデルへまたはbindModelで動的に設定する。

class Order extends AppModel{
  public $belongsTo = ['OrderItem'];
}

取得結果

実行SQL

アソシエーション先が外部結合で取得される。

オプション

$belongsTo = array(
  'User'=>array(
    'foreignKey'=>'user_id',//外部キーとして使う自モデルのフィールド名。
    'fields'=>array('user_nm'),//アソシエーション先の取得フィールド
    'conditions'=>array(),//アソシエーション先のフィルタ条件。
    'type'=>'left',//結合の種別leftかinnerを指定できる。
  )

プログラム中でアソシエーションの設定・解除

設定

$this->Model->bindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
))

bindModelは一度きりなので恒久的に設定する場合は、第二引数にfalseを設定する。

$this->Model->bindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
),false)

解除

$this->Model->unbindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
))
21
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
26