CakePHP | 親子関係にある子のデータをきれいに消す方法
親子関係にあるデータ管理は、自前で実装すると結構たいへんです。
たとえば、ユーザー情報と、明細情報のような関連のあるデータを考えています。
・Users
・UserDetails
上記のようなテーブルでは、
Usersを登録したら、関連のあるUserDetailsも登録したり、
Usersを削除したら、関連のあるUserDetailsも削除するような管理が必要となります。
CakePHPでは、とても簡単に実現することができます。
具体的な方法は、エンティティのassociated属性に、アソシエーションを設定します。
テーブルクラス(抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class UserTable extends Table { public function initialize(array $config): void { parent::initialize($config); $this->setTable('users'); $this->setDisplayField('id'); $this->setPrimaryKey('id'); $this->addBehavior('Timestamp'); $this->hasMany('UserDetails', [ 'foreignKey' => 'user_id', 'dependent' => true, 'cascadeCallbacks' => true, 'saveStrategy' => 'replace', ]); } } |
コントローラー(抜粋)
1 2 3 4 5 6 |
$this->Users->patchEntity($user, $data, [ 'associated' => [ 'UserDetails', ] ]); |
Cookbook
結合テーブルへの追加データの保存
https://book.cakephp.org/4/ja/orm/saving-data.html#id19