CakePHP HABTM - 我不明白

时间:2012-01-07 23:01:29

标签: cakephp has-and-belongs-to-many

之前被问到但仍然在黑暗中。

cakePHP HABTM, am I getting it all wrong?

将再试一次:
我有两张表:storesmanagers
我想创建一个新表,managers_stores并使用它来为每个商店保留一份完整的经理列表 我知道每个save()动作将提供完整的记录数据(我打算这样做)将导致删除表行,只保留新记录。
根据我的需要,这是一种不受欢迎的行为。那么,我该如何管理我的应用程序的HABTM信息以及删除我保存的数据背后的想法是什么?!

感谢

2 个答案:

答案 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关联。例如。 (伪代码):

  • 经理HABTM存储1,2和3
  • Manager->saveAll(array('Manager' => ..., 'Store' => array(4, 5, 6)))
  • 经理现在HABTM存储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)

'拥有和属于许多'是物体松散地捆绑在一起的地方。如果您使用storesmanagers类比,一个商店有很多经理,一个经理有很多商店(不知道它是如何运作的,也许他们是流动的经理?:P)。

首先,我认为您与经理商店一起使用的示例不是HABTM。它只有一个store有很多managers,而stores不多。在这里使用 HABTM 意味着经理可以同时属于多个商店!但无论如何我会解释。

无论如何,当使用HABTM时,这种关系需要一个可能称为manager_stores的类似中间表。如果使用自动化工具,这将由CakePHP自动设置。这使您可以将无限数量的经理链接到无限数量的商店。

更新和删除记录时会发生什么情况取决于MySQL关系的配置(您需要使用InnoDB引擎)。

这与您使用的关系类型无关

如果您使用的是phpMyAdmin,请进入表格的结构视图。然后点击“关系视图”。

如果您正确设置InnoDB,您应该看到关系和两列“ON UPDATE”和“ON DELETE”。这可以确定修改记录时的行为。

我会整天在这里解释不同类型的ON DELETE和ON UPDATE动作。尝试对关系数据库查询进行一些研究!

我希望这对你有所帮助。我很乐意回答你的任何问题!