我的主机对象有许多与之关联的选项对象.在编辑表单中,用户可以(de)选择选项并保存新的关联集.这是使用发布数据上的saveAll()实现的.结果是
>主机(主)对象已更新,
>更新先前和新关联中包含的选项(关联)对象,以及
>创建未包含在先前关联中但包含在新关联中的选项对象.
但是没有发生的事情是
>删除先前关联中包含但未包含在新关联中的选项对象.
问题:saveAll()也可以这样做,数据结构如何实现这种效果?
相关信息:
我处理编辑表单的代码实际上更复杂(因此我在这里没有引用它),但它导致了书中描述的数据结构:
( [Host] => ( ... host object fields ... ),
[Option] => ( [0] => ( ... first option object fields ... ),
...
[n] => ( ... nth option object fields ... )
)
)
现在,如果原始主机具有未包含在0..n数组中的关联选项,则saveAll()将不会检测到此选项,并且不会删除该关联对象.
不确定这是否相关,但我使用的是CakePHP 1.3.
解决方法:
HABTM删除所有相关记录,然后重新创建所需内容.正如PawelMysior建议的那样,您可以通过在保存之前手动删除关联记录来使用hasMany实现此目的.但是,危险在于保存失败,你失去了以前的状态.
我会使用GJ解决方案的变体并在成功保存后删除它们,而是循环遍历冗余ID数组并使用Cake的Model-> del()方法.这样您就可以保留所有内置错误处理.