アソシエーション – モデル同士を繋ぐ

Posted by muchag | CakePHP 3.x | 2018-04-16 (月) 19:14:27


公式:アソシエーション – モデル同士を繋ぐ

【環境】
CakePHP: 3.5.11
php: 7.1.5
種別
関係 アソシエーション種別
1 対 1 hasOne ユーザーは1つのプロフィールを持っている。
1 対 多 hasMany ユーザーは複数の記事を持つことができる。
多 対 1 belongsTo 多くの記事がユーザーに属している。
多 対 多 belongsToMany タグは多くの記事に属している。
記述場所

各 Table クラスの initialize 内。


public function initialize(array $config)
{
    $this->hasOne('Addresses')
        ->setName('Addresses')
        ->setConditions(['Addresses.primary' => '1'])
        ->setDependent(true);
}
書式

上記4メソッドとも、最終的には下記 Association オブジェクトのコンストラクタが呼ばれる。

/vendor/cakephp/cakephp/src/ORM/Association.php

public function __construct($alias, array $options = [])

第1引数:エイリアス名。contain オプションに指定する名称
第2引数:オプション

hasOne
options
className 当該のモデルに関連付けられるモデルのクラス名。
『User hasOne Address』 の関係を定義したい場合、 className キーは 『Addresses』 になるはずです。
foreignKey 相手側のテーブル上の外部キーの名前。
これは複数の hasOne の関係を 定義する必要がある場合に特に便利です。
このキーの既定値は当該のモデルの名前を アンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
上の例では 『user_id』 が既定になります。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
指定されなかった場合、主キー(例えば Users テーブルの id カラム)が使われます。
conditions [‘Addresses.primary’ => true] のような find() 互換の条件の配列です。
joinType SQL クエリーで使われる結合の種別で、既定は LEFT です。
もし hasOne アソシエーションが常にあれば INNER を使うことができます。
dependent dependent キーが true に設定され、そしてエンティティーが削除された場合、 関連付けられたモデルのレコードも削除されます。
この例では User を削除した時に 関連付けられた Address も削除されるようにしたければ true にします。
cascadeCallbacks これと dependent が true の時には、カスケード削除は コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。
既定は、アソシエーションの名前をアンダースコアーで区切り、 単数形にしたもので、よって例では address です。
strategy クエリーで使うためのストラテジーを定義します。
既定は 『join』 です。
他の有効な値は 『select』 で、これは代わりに別のクエリーを使用します。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
belongsTo
options
className 当該のモデルに関連付けられるモデルのクラス名。
『Profile belongsTo User』 の関係を定義したい場合、 className キーは 『Users』 になるはずです。
foreignKey 当該のテーブル上の外部キーの名前。これは同一のモデルに対して複数の belongsTo 関係を定義する必要がある場合に特に便利です。このキーの既定値は 相手側のモデルの名前をアンダースコアーで区切り、単数形にして _id を末尾に付けたものです。
bindingKey foreignKey での紐付けで使用される、相手側のテーブルのカラム名。
指定されなかった場合、主キー(例えば Users テーブルの id カラム)が使われます。
conditions [‘Users.active’ => true] のような find() 互換の条件の配列、 または SQL 文字列です。
joinType SQL クエリーで使われる結合の種別で、既定は LEFT であり、これは すべての状況で要求を満たすとは限らず、メインおよび関連付けられたモデル一式を返すか あるいは何も返さないようにしたい場合には INNER が便利です。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 単数形にしたもので、よって例では user です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『join』 です。
他の有効な値は 『select』 で、これは代わりに別のクエリーを使用します。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
hasMany
options
className 当該のモデルに関連付けられるモデルのクラス名。
『User hasMany Comment』 の関係を定義したい場合、 className キーは 『Comments』 になるはずです。
foreignKey 相手側のテーブル上の外部キーの名前。これは複数の hasMany の関係を 定義する必要がある場合に特に便利です。このキーの既定値は当該のモデルの名前を アンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
指定されなかった場合、主キー(例えば Articles テーブルの id カラム)が使われます。
conditions [‘Comments.visible’ => true] のような find() 互換の条件の配列、 または SQL 文字列です。
sort [‘Comments.created’ => ‘ASC’] のような find() 互換の order 句の配列、 または SQL 文字列です。
dependent dependent が true に設定されている場合、再帰的なモデル削除が可能です。
この例では Article レコードを削除した時に Comment レコードが削除されます。
cascadeCallbacks これと dependent が true の時には、カスケード削除は コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 複数形にしたもので、よって例では comments です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『select』 です。
他の有効な値は 『subquery』 で、これは IN のリストを等価のサブクエリーに置き換えます。
saveStrategy 『append』 または 『replace』 のいずれかです。デフォルトは 『append』 です。
『append』 の場合、当該のレコードがデータベース中のレコードに追加されます。
『replace』 の場合、 関連付けられたレコードで当該のセットにないものは削除されます。もし外部キーが null になれるカラムの場合、または dependent が真の場合、レコードは親を持たなくなります。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
belongsToMany
options
className 当該のモデルに関連付けられるモデルのクラス名。
『Article belongsToMany Tag』 の関係を定義したい場合、 className キーは 『Tags』 になるはずです。
joinTable このアソシエーションで使われる結合テーブルの名前 (当該のテーブルが belongsToMany 結合テーブルの命名規約に準拠していない場合)。
既定では、結合テーブル用の Table インスタンスを読み出すためにこの名前が使われます。
foreignKey 結合テーブル上の当該のモデルを参照する外部キーの名前、または複合外部キーの場合はリスト。
これは複数の belongsToMany の関係を定義する必要がある場合に特に便利です。
このキーの既定値は当該のモデルの名前をアンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
既定ではその主キーです。
targetForeignKey 結合モデル上の対象モデルを参照する外部キーの名前、 または複合外部キーの場合はリスト。
このキーの既定値は当該のモデルの名前をアンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
conditions find() 互換の条件の配列、または SQL 文字列です。
関連付けられたテーブル上に条件を持つには、 『through』 モデルを使用し、 それに必要な belongsTo アソシエーションを定義してください。
sort find() 互換の order 句の配列。
dependent dependent キーが false に設定され、そしてエンティティーが削除された場合、 結合テーブルのデータは削除されません。
through 結合テーブルで使用する Table インスタンスのエイリアス、またはインスタンス自体の いずれかを指定できます。これにより、結合テーブルのキーのカスタマイズが可能になり、 そして結合テーブルの動作をカスタマイズすることができます。
cascadeCallbacks これが true の時には、カスケード削除は結合テーブル上の コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。これはオーバーヘッドの削減を助けるために 既定では false になります。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 複数形にしたもので、よって例では tags です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『select』 です。
他の有効な値は 『subquery』 で、これは IN のリストを等価のサブクエリーに置き換えます。
saveStrategy 『append』 または 『replace』 のいずれかです。
既定は 『replace』 です。
関連するエンティティーの保存に使用するモードを示します。前者はリレーションの両側の間に 新しい紐付けを作成するだけで、後者は保存する時に渡されたエンティティーの間に 紐付けを作成するために消去と置換を行います。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
CakePHP 3.x | 2018-04-16 (月) 19:14:27 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment