【问题标题】:CakePHP save two models, second based on firstCakePHP 保存两个模型,第二个基于第一个
【发布时间】: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?

谢谢!

【问题讨论】:

    标签: cakephp model save


    【解决方案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()保存相关模型。
    最近更新 更多