CakePHP 在 HABTM 表中保存数据

Posted

技术标签:

【中文标题】CakePHP 在 HABTM 表中保存数据【英文标题】:CakePHP Save data in HABTM Table 【发布时间】:2013-08-20 09:56:38 【问题描述】:

我正在尝试保存这样的数组

$myData = array(
    'User' => array('id' => 17),
    'Group' => array(
        array('group_id' => 2),
        array('group_id' => 3),
        array('group_id' => 4),
        array('group_id' => 5),
        array('group_id' => 6)
    )
);

在我的 HABTM 连接表 (groups_users) 中。我尝试了以下 save 调用,但没有一个奏效。

$this->User->save($myData);
$this->User->saveAssociated($myData);
$this->User->saveAll($myData);
$this->User->GroupsUsers->save($myData);
$this->User->GroupsUsers->saveAll($myData);

在你问之前:是的,我的关联设置正确,我可以通过调用来保存数据:

$this->User->GroupsUsers->saveAll(array(
    0 => array(
        'GroupsUsers' => array('user_id' => $id, 'group_id' => 1)
    ),
    1 => array(
        'GroupsUsers' => array('user_id' => $id, 'group_id' => 2)
    )
));

但只保存了两条记录中的一条,尽管我在模型的 HABTM 关系定义中将 unique 设置为 false。

错误在哪里?我的数组结构无效吗?

【问题讨论】:

【参考方案1】:

问题是您的数据数组格式不正确。

您的Group 模型可能有一个id 字段,而您的连接模型GroupsUser 将有一个group_id 字段。

所以您需要将您的group_id 更改为id

【讨论】:

【参考方案2】:

试试

$myData = array(
    'User' => array('id' => 17),
    'Group' => array(
        'Group' => array(
            0 => 2,
            1 => 3,
            2 => 4,
            3 => 5,
            4 => 6
        )
    )
);

【讨论】:

我应该在哪个模型上执行保存调用? 用户模型。 $this->User->saveAll($myData);【参考方案3】:

只是为了回答你的问题,即使它是旧的。

您不必在 saveAll 调用中调用您的“GroupsUsers”模型,这正是关联模型的目标,cakephp 为您做到了。

您应该将此数组传递给您的用户/组模型上的 saveAll 函数:

array
    array
        'User' => array 
             'id' => 25
         ,
         'Group' => array 
             'id' => 2
         
    
    array
        'User' => array 
             'id' => 47
         ,
         'Group' => array 
             'id' => 2
         
    

您的用户模型和组模型应该彼此之间具有 HABTM 关系,因此您只需要这样做:

来自用户/组控制器:

$this->User/Group->SaveAll($myData);

来自用户/组模型:

$this->SaveAll($myData);

就是这样,GroupsUsers 表会保存 2 条记录,通过自己保存在 HABTM 关系表中,你并没有使用 cakePHP 的强大功能。

如果 ID 不存在,则会创建 User 和 Group 表中的记录,如果不存在则更新。

保存在 HABTM 表中的唯一原因是如果您想在该表中保存一些额外信息,例如“已验证”字段,如果您想在他询问后验证成员例如加入一个群组。

【讨论】:

以上是关于CakePHP 在 HABTM 表中保存数据的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp habtm 关系更新而不是保存

CakePHP 在 HABTM 字段中保存数据

无需表单即可保存 cakePHP HABTM 数据

在 HABTM 的情况下,CakePHP 不会保存正确的数据

CakePHP 保存 HABTM 数据

cakephp 在不使用视图的情况下保存 HABTM 关系的数据