CakePHP 保存两个模型,第二个基于第一个
Posted
技术标签:
【中文标题】CakePHP 保存两个模型,第二个基于第一个【英文标题】:CakePHP save two models, second based on first 【发布时间】:2010-12-15 17:02:14 【问题描述】:我有以下关联:
组 hasAndBelongsToMany 用户,与 groups_users 连接表。
当我创建一个新组时,我想将组的创始人添加到联接表中。
我的 $this->data 数组看起来像:
Array
(
[Group] => Array
(
[name] => seyufgsduifsj
[access] => 2
[founder_id] => 3
[random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn
)
[GroupsUser] => Array
(
[user_id] => 3
[group_role_id] => 1
[random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2
)
)
我尝试使用 save() 和 saveAll(),但它只会在组表中添加组,而不是用户组关联。
所以,基本上,我有一个添加表单,用户可以在其中填写组名和访问权限。然后,如果数据有效,我会向组数组(如 random_key)和连接表数组(如 user_id 和 group_role_id)添加更多字段值。我希望 Cake 首先保存组,获取它的 id,使用正确的 group_id 更新连接表数组,然后也保存第二个数组。
这是否可能以直接的方式实现,还是我必须编写两个后续的 save() 方法,第二个方法提供第一个中最后插入的 id?
谢谢!
【问题讨论】:
【参考方案1】:您可以使用 saveAll() 函数,但您需要更改 GroupsUser 数组的格式。根据saveAll() 的文档,您的数据应如下所示:
Array
(
[Group] => Array
(
[name] => seyufgsduifsj
[access] => 2
[founder_id] => 3
[random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn
)
[GroupsUser] => Array
(
[0] => Array
(
[user_id] => 3
[group_role_id] => 1
[random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2
)
)
)
如果关系是Group belongsTo GroupsUser,您的示例将起作用,但我相信这不是您的情况
【讨论】:
感谢您的回答,但我的关系是 GroupsUser belongsTo Group,因为 GroupsUser 是 HABTM 连接表。无论如何,我已经尝试过您的解决方案,它只保存了组。【参考方案2】:也许相关模型没有通过验证。 仅当所有模型都验证时才使用以下代码保存:
$this->Group->saveAll($this->data, array('validate' => 'only'));
如果您这次没有发现您的组被保存,那么很可能是您的联接模型中的验证规则失败了。我的猜测是您对group_id
进行了notEmpty
验证,您必须将其删除才能使 saveAll() 工作。
希望这能为您指明解决问题的方向。
编辑:你的联想有点不对劲。应该是这样的:
Group hasMany GroupsUser
User hasMany GroupsUser
GroupRole hasMany GroupsUser
GroupsUser belongsTo Group
GroupsUser belongsTo User
GroupsUser belongsTo GroupRole
删除组和用户之间的hasAndBelongsToMany
关联。它已经不存在了。
【讨论】:
我听从了您的建议,但由于连接模型中的验证错误,它可能无法保存。考虑到这一点,我从连接模型中删除了所有验证设置,并且仍然数据没有保存。 为什么要将HABTM关系改为多个hasMany-belongsTo? HABTM 不是针对这些情况吗? 引用书中的话:“有时需要存储具有多对多关联的附加数据。”此时您需要使用 hasMany Through,而不是 HABTM 关系。 book.cakephp.org/view/1039/… 好的,我会尝试 hasMany 到那个时候。当我和所有者一起保存组时,我也会这样做,$this->Group->save()
?
使用saveAll()
保存相关模型。以上是关于CakePHP 保存两个模型,第二个基于第一个的主要内容,如果未能解决你的问题,请参考以下文章
使用cakephp 3根据第二个表从数据库中查找记录[重复]