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 关系的数据

在 CakePHP 中使用 HABTM 保存 hasOne

CakePHP 从一个 habtm 返回多条记录

尝试在保存时保存 CakePHP HABTM 关系中的重复关联

CakePHP 在 HABTM 字段中保存数据

Cakephp habtm 关系更新而不是保存