(cakephp) アソシエーションで複数のモデルを操作

アソシエーション

  • モデル同士のデータの関連を設定することで、一度のデータ操作で複数モデルからデータを取得したり、データを更新する機能。

  • 内部の処理では、自動的にSQLにJOINを追加したり、関連データを再度取得するクリエを実行するなどして必要なデータを取得する。

  • findメソッドのrecursiveオプション指定で、処理ごとに関連データを取得する範囲を限定できる。

⭐︎アソシエーションの種類

リレーションシップ  アソシエーション名 例  
1 対 1 hasOne  桃太郎は絵本である(ジャンル重なるのない)    
1 対 多   hasMany 桃太郎は「面白い」、「子供に人気」、「また読みたい」という複数のレビューを持っている。                                      
多 対 1   belongsTo  「面白い」、「子供に人気」、「また読みたい」という複数のレビューは桃太郎のことだ。    
多 対 多 hasAndBelongsToMany 桃太郎とバカの壁は、新書であり、絵本であり、ベストセラーである。  

A belongsTo (多対1)

  • モデルが別のモデルのデータに所属している。

 複数のレビューは1冊の本に属している。( = 「「面白い」、「泣ける」、「また読みたい」など複数のレビュー」は「ゼロ」に属している。)

{ 新着レビュー一覧から1冊の本を調べたい☆

外部キーを自分側に持っている!!!!

B hasOne (1 対 1)

  • モデルが別のモデルのデータを所有する。

    1冊の本は唯一の出版年月日を持っている。( = 「ゼロ」は「2015年3月3日」の出版年月日を持っている。)

    { 1冊の本から出版年月日を調べる☆

hasOneは、相手(出版年月日tb)の方に主キーを持っている。

C hasMany (1 対 多)

  • モデルが別のモデルの複数のデータを所有する。

    1冊の本は複数のレビューを持っている。( = 「ゼロ」は「面白い」、「泣ける」、「また読みたい」など複数のレビューも持っている。)

    {「ゼロ」から、そのレビューを探したい。

hasManyは、相手(レビューtb)の方に主キーを持っている。

D hasAndBelongsToMany (多対多)

  • 多対多の関係でモデルとモデルを結びつけるアソシエーション
    お互いにhasManyの関係、belongsToの関係が成り立たない

    複数の本は、文庫本であり、ペストセラーである。

☆キー

className → 所属先のデータを扱うモデルクラス。
foreignKey → アソシエーション先のモデルを検索するための外部キー。
associationForeignKey → アソシエーション先のもう一方のモデルを検索するための外部キー。