CakePHP HABTM关系,设置相关记录总是在jointable中添加新条目,即使已经存在

CakePHP HABTM关系,设置相关记录总是在jointable中添加新条目,即使已经存在,cakephp,cakephp-1.3,has-and-belongs-to-many,Cakephp,Cakephp 1.3,Has And Belongs To Many,这是我的代码: $charities = explode(',',$this->data['Charity']['charities']); foreach ($charities as $key=>$charity){ $data['Charity'][$key] = $charity; } $this->Grouping->id = $this->data['Charity'

这是我的代码:

        $charities = explode(',',$this->data['Charity']['charities']);
        foreach ($charities as $key=>$charity){
            $data['Charity'][$key] = $charity;
        }
        $this->Grouping->id = $this->data['Charity']['grouping_id'];
        if ($this->Grouping->save($data)){
            //Great!
        }else{
            //Oh dear
        }
代码来自AJAX调用的操作$此->数据['Charity']['charities']是一个以逗号分隔的慈善机构模型ID列表,该列表包含一个分组

代码运行良好,只是Cake似乎没有检查慈善机构是否已经与该分组关联,因此我在联接表中有大量重复条目。我可以看出,这将是一个痛苦的以后,所以我想得到它现在

我做错了什么


谢谢

我发现了几件事:

A.
$this->data['Charity']['charities']
是否是一个数组,其命名键对应于表列?因为在foreach()循环中,您将获取密钥并将其放入
$data['Charity']
数组中。结果可能是格式错误。模型保存的$data数组的格式通常为
$data['Charity']['NAME\u OF_COLUMN1],$data['Charity']['NAME\u OF_column2]
,依此类推。因此,如果键是数字,那么您可能会有如下内容:
$data['Charity'][0],$data['Charity'][1]
,这是错误的

B.HABTM关联的保存方式不同。我的建议是,你看一看。我保存了如下HABTM关系(假设用户和优惠券之间存在关系):


$this->data['Coupon']=array('id'=>1,'code'='BlaBla')
$this->data['User']=array('id'=>33)
$this->优惠券->保存($this->data,false);

因此,正如您所看到的,$data数组有一个子数组,该子数组以外部模型(“用户”)命名,其中包含我要保存的列+值。然后我将这个数组保存到优惠券模型中


C.请注意,CakePHP在“更新”HABTM关系时,总是会删除旧记录,并在联接表中插入新记录。为了避免这种情况,您在模型的$HABTM配置中将“unique”字段设置为false。

我认为在保存之前,您可能必须清除该模型的任何现有HABTM记录表。你可以把那个小狙击手放进事先保存的方法。实际上,这段代码现在看起来有点傻,只需将其读作$data['Charity'][],不需要$key。B.数据是否需要采用格式$this->data['User']=array(0=>array('etc')、1=>array('etc')?感谢您仅在$data数组用于多条记录时才向其添加数字索引(请参阅)。但如果只保存一条记录,则数组必须类似于
$data['ModelName']['fieldname']
。因此,在您的原始代码中,您正在执行foreach,获取迭代的$charity,这是一个字符串,并将其分配给
$data['charity'][
。这将导致以下情况:
$data['Charity'][0]=>“迭代的慈善价值”
。看见字段名或子数组没有任何位置(在保存多个字段的情况下)。