CakePHP2以前のバージョンでは、複合主キーに対応していません。
回避策
・もし可能であれば、新しいフレームワーク(CakePHP3など)を利用してください。
・もし可能であれば、テーブルの構成を変更してください。
サロゲートキーを追加するのが2系時代の一番の解法とのこと。
・updateAllで保存する
updateAllなら主キー以外で保存できるため。
・queryでやっちゃう
現象
複合主キーを持つテーブルを更新しようとすると、
以下のような予期しない動作が起こります。
例では、company_idとmember_idが主キーのテーブルで、
Modelのprimary_keyにmember_idが定義されている場合を示しています。
saveする時に、同じ主キーの片方を持つレコードがupdateされる
例)C社のmemberとして 1001
さんをsaveしたかったのに
company_id(PK) | member_id(PK) |
---|---|
S | 1001 |
↓ S社のレコードがupdateされてしまう
company_id(PK) | member_id(PK) |
---|---|
C | 1001 |
実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers` WHERE `CompanyMembers`.`member_id` = 1001
UPDATE `db`.`company_members` SET `member_id` = 1001, `company_id` = `C` WHERE `db`.`company_members`.`member_id` = 1001
deleteする時に、同じ主キーの片方を持つレコードがdeleteされる
例)C社のmember 1001
さんをdeleteしたかったのに
company_id(PK) | member_id(PK) |
---|---|
S | 1001 |
C | 1001 |
↓ S社のレコードがdeleteされてしまう
company_id(PK) | member_id(PK) |
---|
実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers` WHERE `CompanyMembers`.`member_id` = 1001
DELETE `CompanyMembers` FROM `db`.`company_members` AS `CompanyMembers` WHERE `CompanyMembers`.`member_id` = (1001)