好的,这就是我的think正在发生:
你没有使用超级有用的 HABTM 关系魔法。 Cake 不将该表视为单纯的关系表,而是转到定义的模型并查看您定义的关系以及primaryKeys 和displayFields 等。
当您有一个复杂的 HABTM 表时,这没问题。但如果是这样的话,你的数据数组就乱了,因为你没有添加Question
and Qset
分别地。我的意思是,你没有做
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
这样做,你让 cake 为你解析 HABTM 关联,并且该数据结构就可以了。但是您的模型文件夹中有自己的 QsetsQuestion 模型。所以你保存的数据应该像任何其他表一样,就像这样
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
这会在 qsets_questions 表中创建一个新的 id,并具有新的关系,就像您想要的那样。
不过要小心,因为你使用自己的模型,如果你没有正确设置验证,你可能会多次拥有同一对外键,因为默认情况下 cake 只是检查 id 必须是唯一的。
[EDIT]经过一番澄清后,上面的解决方案确实解决了“问题”,但实际上并不是这种行为的原因。
Cakephp 有一个feature http://book.cakephp.org/2.0/en/models/saving-your-data.html#what-to-do-when-habtm-becomes-complicated
默认情况下,当保存 HasAndBelongsToMany 关系时,Cake 会
在保存新行之前删除连接表上的所有行。例如
如果您的俱乐部有 10 名相关儿童。然后你更新
俱乐部有 2 个孩子。俱乐部只有 2 名儿童,而不是 12 名。
因此,当您想要添加新行时,cake 会删除所有先前的关联并添加新的关联。解决这个问题的一个方法是找到所有Qsets
属于一个问题并将它们添加到$data
数组(添加您要添加的新问题关联)。这个链接 http://rottmann.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/帮助我了解 HABTM 关联(查找“挑战 IV”)。
我知道我之前给出的解决方案可以帮助您解决“问题”,但它是在您有这样的印象的情况下做出的QsetsQuestion
模型文件某处。既然你不这样做,解决方案就是获取所有Questions
关联并将它们添加为新数组。Or实际上创建一个QsetsQuestion
模型,并进行如下关联:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
或者改变蛋糕的行为......我知道它们看起来都不漂亮。
因此,解决方案总结:
-
每次要保存新的Qset-Question关联时,检索以前存储的关联,将其放入要保存的数组中,然后保存
//find previously associated Qsets, lets say it's 1,2,3 and 4
$data = array('Question'=>array('id'=>1),
'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
$this->Question-save($data);
注意没有QsetsQuestion
,因为它不存在。这应该是第一个选项,因为 HABTM 模型并不复杂
OR
-
Create QsetsQuestion
在您的模型文件夹中并更改如上所述的关联。控制器上的保存部分是
$data = array('qset_id'=>1, 'question_id'=>1)
$this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
它要简单得多(也许),但是您必须创建一个新文件,并记住检查以前是否没有类似的关联(在插入之前检查 2-2 元组是否存在)。简单的验证规则应该有效。
OR
- 为此改变 cakephp 行为...我不喜欢这个。