在控制器中添加HABTM数据

时间:2014-03-17 14:09:52

标签: cakephp cakephp-2.0 has-and-belongs-to-many

在我的应用中,Users HABTM Solicitations

使用$this->Solicitation->save($this->request->data)保存表单后,我需要在solicitations_users表中添加另一个user_id值。

$data[] = array('User' => array('id' => 5), 'Solicitation' => array('id' => 77));
$data[] = array('User' => array('id' => 6), 'Solicitation' => array('id' => 77));

  $this->Solicitation->saveMany($data);

我的$data就是这样:

array(
'User' => array(
    'id' => (int) 6
),
'Solicitation' => array(
    'id' => '54'
)
)

我需要在表单中保存关联,然后将上面的新记录添加到solicitations_users表中。它只保存6而不保存表单中的数据。如果我删除第二个save,它只会保存表单。

我意识到在数据库中,这是一个id。 这应该是'id' 36 => 5; 'id' 37 => 6。看起来好像正在更新表格。

以下是查询:

enter image description here

5 个答案:

答案 0 :(得分:1)

您发布的数据结构是什么样的?

根据the cookbook,它应该是

Array(
    'User' => Array(
        'id' => 6
    ),
    'Solicitation' => Array(
        'title' => 'A request'
    )
)

答案 1 :(得分:1)

当您保存habtm关系蛋糕时,删除与该项目相关的所有记录,并重写您正在保存的那些记录。

查看关于它的manual

所以你必须同时保存所有记录,提供如下数组:

$data = array(
    'Solicitation' => array('id' => 77),
    'User' => array(
        'User' => array(6, 7)
    )
);

$this->Solicitation->saveAll($data);

您还可以在habtm关联数组中设置'unique' =>'keepExisting'

答案 2 :(得分:1)

给这两个中的一个:

$data[] = array('User' => array('id' => 5), 'Solicitation' => array('id' => 77));
$data[] = array('User' => array('id' => 6), 'Solicitation' => array('id' => 77));

$this->Solicitation->saveMany($data, array('deep' => true));

OR

$data[] = array('SolicitationsUser' => array('User.id' => 5,'Solicitation.id' => 77));
$data[] = array('SolicitationsUser' => array('User.id' => 6,'Solicitation.id' => 77));

$this->Solicitation->saveMany($data);

答案 3 :(得分:1)

我认为最简单的方法是使用foreach。象 -

$data[] = array('User' => array('id' => 5), 'Solicitation' => array('id' => 77));
$data[] = array('User' => array('id' => 6), 'Solicitation' => array('id' => 77));

foreach($data as $da){
  $this->Solicitation->saveMany($da);
}

答案 4 :(得分:-1)

谢谢你们。

但是,基于这个答案:CakePHP: Creating new HABTM row instead updates other

我发现代替SaveAll创建一个新行,它会更新已存在的新记录。 因此,我使用query()添加新行。

$this->Solicitation->query("INSERT INTO `contratos`.`solicitation_users` (user_id,solicitation_id) values($id, $solicitation");

全部谢谢