CakePHP HABTM-我不知道';我不明白

CakePHP HABTM-我不知道';我不明白,cakephp,has-and-belongs-to-many,Cakephp,Has And Belongs To Many,以前问过,但还是在黑暗中 将重试: 我有两张表:商店和经理 我想创建一个新的表,列出每个门店的经理,并使用它保存每个门店经理的完整列表。 我知道,提供完整记录数据的每个save()操作(如我所愿)都会导致删除表行,并且只保留新记录。 这是我不想要的行为。那么,我应该如何管理我的应用程序的HABTM信息?删除我保存的数据背后的想法是什么 谢谢“拥有并属于许多人”是将对象松散地绑在一起的地方。如果使用商店和经理类比,一个商店有多个经理,一个经理有多个商店(不确定这是怎么回事,可能他们是流动经理?:

以前问过,但还是在黑暗中

将重试:
我有两张表:
商店
经理

我想创建一个新的表,列出每个门店的经理,并使用它保存每个门店经理的完整列表。
我知道,提供完整记录数据的每个
save()
操作(如我所愿)都会导致删除表行,并且只保留新记录。
这是我不想要的行为。那么,我应该如何管理我的应用程序的HABTM信息?删除我保存的数据背后的想法是什么


谢谢

“拥有并属于许多人”是将对象松散地绑在一起的地方。如果使用
商店
经理
类比,一个商店有多个经理,一个经理有多个商店(不确定这是怎么回事,可能他们是流动经理?:P)

首先,我认为你使用的管理商店的例子不是HABTM。它只是一个
商店
有许多
经理
,没有多少
商店
。在这里使用HABTM意味着经理可以同时属于多个门店!无论如何,我会解释的

无论如何,在使用HABTM时,这种关系需要一个中间表,可能称为
manager\u stores
或类似的东西。如果使用自动化工具,这将由CakePHP自动设置。这允许您将无限数量的经理链接到无限数量的商店

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

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

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

如果您正确设置了InnoDB,您应该会看到关系和两列,分别是“更新时<代码>和删除时<代码>”。这决定了修改记录时的行为

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

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

save()
不会删除任何内容,只有使用
saveAll()
保存时,如果关系的
unique
值为
true
,则会截断要保存的特定型号的
managers\u stores
条目。手册中没有完全明确这一点:

unique:
If
true
(默认值)在更新记录时,cake将首先删除外键表中的现有关系记录,然后再插入新记录。因此,更新时需要再次传递现有关联

无论何时
save()
一条单独的记录,都只会触动该记录。
当您
saveAll()
a,例如,
Manager
记录与关联的
Store
记录同时进行时,
managers\u stores
链接将被重置,并且只有您保存的记录中的存储将与管理器关联。例如(在伪代码中):

  • HABTM门店1、2和3经理
  • Manager->saveAll(数组('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));

谢谢@Kieran。请注意:每位经理都可以!管理多个门店,每个门店可以由多个经理管理。我提到的第三个表是您提到的cake用作中间表的表。我的问题是,根据cake的文档,每个保存到该表的操作都会首先删除表的内容,然后只保存新记录。@yossi哦,我明白你的意思了。你自己试过吗?您是否真的遇到了这个问题,或者手册上是这么说的?谢谢。我会那样做的。虽然我真的不明白为什么。。这个默认行为背后的登录名是什么?它默认保存模型的“绝对状态”。您告诉it部门保存经理记录,根据您的说法,经理记录与门店4、5和6关联。Cake认为这意味着经理只有4号、5号和6号门店。这对于通常在一个界面中管理的关联很少的简单模型(例如,带有关联标记的博客文章)是有意义的。