CakePHP 我应该在 HABTM 关系中使用 keepExisting 吗?
Posted
技术标签:
【中文标题】CakePHP 我应该在 HABTM 关系中使用 keepExisting 吗?【英文标题】:CakePHP should I be using keepExisting in a HABTM relationship? 【发布时间】:2013-07-27 01:16:37 【问题描述】:我是 Cake 新手,想弄清楚这是怎么可能的,或者我是不是走错了路。
Question hasMany Answer
Quiz HABTM Answer
所以我有以下表格:quizzes、answers、quizzes_answers
但是,有一种问题不符合标准。这类题需要记录一个image_id。所以我正在考虑将这些数据存储在关联表中,但我不确定如何使用 HABTM 设置:
'unique' => 'keepExisting'
这似乎无法保存我需要的数据。如果是这样,我将如何在视图中构造表单以保存这些数据?
或者...我应该创建另一个模型吗?如果我无法在关联表中成功保存 image_id,也许另一种方法是与 Quiz 模型和新模型建立另一个关联?
Quiz hasMany StudentAnswer
我将存储 quiz_id、question_id、answer_id 和 image_id 的位置。最后一个: image_id 将为 0 除非所问的问题是特定类型的。在这种情况下,我会删除上面的 HABTM 关联。
希望这很清楚。如有必要,我可以进一步详细说明。
更新: 我可以为 quizzes_answers 表保存 quiz_id、answer_id 和 image_id。但是,如果进行了更多更新,则会删除先前的关联。而且我有独特的设置来保持模型中的存在。
public $hasAndBelongsToMany = array( // Quiz Model
'Answer' => array(
'className' => 'Answer',
'joinTable' => 'quizzes_answers',
'foreignKey' => 'quiz_id',
'associationForeignKey' => 'answer_id',
'unique' => 'keepExisting',
'dependent' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
public $hasAndBelongsToMany = array( // Answer Model
'Quiz' => array(
'className' => 'Quiz',
'joinTable' => 'quizzes_answers',
'foreignKey' => 'answer_id',
'associationForeignKey' => 'quiz_id',
'unique' => 'keepExisting',
'dependent' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
【问题讨论】:
【参考方案1】:问题中没有HABTM
在问题中描述有:
Quiz hasAndBelongsToMany Answer
即有一张这样的表:
answers_quizes
answer_id
quiz_id
谁回答了这个问题呢?除非只有一个学生参加过给定的测验 - 习惯关联是不合适的。
为连接表创建模型
尤其是考虑到前面的观点
这里有一个简单的规则,它使一些架构/代码决策变得容易:
具有超过 2 个字段的连接表不是连接表。它本身就是一个模型,需要一个主键。
这并不意味着您不能使用 habtm - 它只是意味着可以选择何时使用(可能读取数据)和何时不使用(保存)。
保持现有?
Keep existing 表示:
当[unique设置为]keepExisting时,行为类似于true,但不删除现有关联。
也就是说,如果给定用户和问题已有 habtm 数据,则在插入新记录之前不会将其删除。例如,如果允许一个用户多次回答同一个问题并且您想要存储所有尝试,而不仅仅是最后一个尝试,这将是合适的。
【讨论】:
我只是指有问题的表格。测验中有一个 user_id。用户有很多测验。测验/答案是 HABTM 的原因是答案已经存在。我只是将用户选择的答案链接到问题。例如。多项选择,4个现有答案。 quizzes_answers 存储用户为测验选择的答案。测验具有与问题的所有关联——测验HABTM问题。这很糟糕吗? 如果它符合目的没有。我无法想象存储测验答案记录有何帮助-除非每个“测验”中只有一个问题-测验真的意味着问题吗?。 测验由 3 种不同类型的问题组成:多项选择、真假和图像匹配。多项选择只有1个正确答案,真假有0-4个正确答案。匹配由一组 5 个图像和 5 个问题组成。每个问题必须与图像相匹配。测验答案记录很有帮助,因为它表明用户为那个特定的、动态创建的测验选择了什么。以上是关于CakePHP 我应该在 HABTM 关系中使用 keepExisting 吗?的主要内容,如果未能解决你的问题,请参考以下文章
cakephp 在不使用视图的情况下保存 HABTM 关系的数据