之前被问到但仍然在黑暗中。
cakePHP HABTM, am I getting it all wrong?
将再试一次:
我有两张表:stores
和managers
我想创建一个新表,managers_stores并使用它来为每个商店保留一份完整的经理列表
我知道每个save()
动作将提供完整的记录数据(我打算这样做)将导致删除表行,只保留新记录。
根据我的需要,这是一种不受欢迎的行为。那么,我该如何管理我的应用程序的HABTM信息以及删除我保存的数据背后的想法是什么?!
感谢
答案 0 :(得分:7)
save()
不会删除任何内容,只保存saveAll()
会截断您要保存的特定模型的managers_stores
条目,如果unique
值关系是true
。这在手册中并未完全清楚:
unique:
如果true
(默认值)cake在更新记录之前首先删除外键表中的现有关系记录,然后再插入新记录。因此,在更新时需要再次传递现有的关联。http://book.cakephp.org/1.3/en/view/1044/hasAndBelongsToMany-HABTM
每当您save()
个人记录时,只会触及该记录
当saveAll()
a,例如,Manager
记录同时包含Store
条记录时,managers_stores
链接将被重置,并且只会记录您记录中的商店已保存将与Manager关联。例如。 (伪代码):
Manager->saveAll(array('Manager' => ..., 'Store' => array(4, 5, 6)))
因此,如果您不喜欢此行为,请将关联中的unique
值设置为false
,或手动管理HABTM记录。老实说,对于任何中途复杂的应用程序,依赖Cake对HABTM关系的自动处理会变得非常脆弱且难以调试,所以我总是自己管理HABTM记录。
$this->Manager->save(...);
$this->Manager->ManagersStore->save(array('manager_id' => $this->Manager->id,
'store_id' => 42));
答案 1 :(得分:1)
'拥有和属于许多'是物体松散地捆绑在一起的地方。如果您使用stores
和managers
类比,一个商店有很多经理,一个经理有很多商店(不知道它是如何运作的,也许他们是流动的经理?:P)。
首先,我认为您与经理商店一起使用的示例不是HABTM。它只有一个store
有很多managers
,而stores
不多。在这里使用 HABTM 意味着经理可以同时属于多个商店!但无论如何我会解释。
无论如何,当使用HABTM时,这种关系需要一个可能称为manager_stores
的类似中间表。如果使用自动化工具,这将由CakePHP自动设置。这使您可以将无限数量的经理链接到无限数量的商店。
更新和删除记录时会发生什么情况取决于MySQL关系的配置(您需要使用InnoDB引擎)。
这与您使用的关系类型无关。
如果您使用的是phpMyAdmin,请进入表格的结构视图。然后点击“关系视图”。
如果您正确设置InnoDB,您应该看到关系和两列“ON UPDATE
”和“ON DELETE
”。这可以确定修改记录时的行为。
我会整天在这里解释不同类型的ON DELETE和ON UPDATE动作。尝试对关系数据库查询进行一些研究!
我希望这对你有所帮助。我很乐意回答你的任何问题!