2012-02-16 179 views
1

当加入两个表之间的关系,我提出将触发到On-更新和-删除外部表的事件的选择。现在我明白,当外表被删除时,On-Delete事件将在本地表中被触发。在-更新和-删除触发器

这种情况的一个实例是在一对一的关系的用户和配置文件。在Propel中,这提供了一些额外的功能,使查找附加记录比使用外键查询简单。现在,我将主键设置为具有CASCADE的On-Delete触发器的用户表的外键。这意味着当我删除用户记录时,配置文件记录也会被删除。现在

什么将层叠在更新触发做?使用propel时,我可以在不保存的情况下更改配置文件属性,然后在用户上调用save,如果我为配置文件设置了级联更新设置,保存用户时会自动保存/更新配置文件信息

这是如此令人困惑的原因是因为表格不知道Propel,所以必须有另外的On-Update原因,并且the Propel documentation只解释了使用On-Delete触发器。

任何一种关于推进有识之士将不胜感激。一些通用的定义不是我正在寻找的。

回答

2

除非因为1.2事情发生了变化,这些仅仅是实施方式(无论是天然的或emmulated),用于tradidional RDBMS约束(mysql 5.5 constraints docs)。这与推动它与数据库无关。因此ON UPDATE将允许您将CASCADE更新的键值 - 这假定您有FK的值可以更改。它与其他专栏没有任何关系。

如果我有级联的更新设置为配置文件,它会自动保存/更新时保存用户的配置文件信息?

即使您没有CASCADE只要相关对象在您发出保存的对象上水合,它也会执行此操作。 ON UPDATE的东西与此无关,它仅仅是一个事实,即两者之间存在一种关系,因此在每个类中都有对象成员允许这样做。当您调用保存在对象上时,它会遍历所有水合对象和集合,并保存标记为已更改的任何内容。

+0

好了,所以如果我通过调用'getProfile()'(因为我的关系1-1)水合物分布和编辑它,我只需要调用'保存()'用户和配置文件会自动更新(知道配置文件已被修改)? – 2012-02-16 19:12:25

+0

是的。关系的另一面也一样。 – prodigitalson 2012-02-16 19:15:00

+0

只为跟进。如果我执行以下操作:'$ profile = $ user-> getProfile();'然后我修改它:'$ profile-> setName('Member');',然后当我保存'$ user'时,'$ profile'也会被保存,对不对? (当您使用One-To-One关系时,'getProfile()'是一种内置的Propel方法,请参见OP中的链接) – 2012-02-16 20:59:42