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根据第二个表从数据库中查找记录[重复]

为啥 Cakephp 的 Controller 第二个测试用例总是失败

敲除加载和保存视图模型

两个对象的EF Core保存错误取决于第二个等于一个

Cakephp habtm 关系更新而不是保存

CakePHP- 保存相关模型数据