【问题标题】:PHP algorithm for updating database records with new entries and removing missing ones without deleting currently saved entries用新条目更新数据库记录并删除丢失的记录而不删除当前保存的条目的 PHP 算法
【发布时间】:2020-07-31 22:08:41
【问题描述】:

在数据库中,我有多个问题的答案值:

问题1 -> 答案1 答案2

问题2 -> answer3 answer4 answer5

--

现在用户提交他对这些答案的更新:

问题1 -> 回答1 回答2 回答6

问题2 -> answer3 answer4

--

那么,进行这些更改的最佳方式是什么?我需要删除丢失的条目,添加新条目而不删除旧值。

最简单的方法是删除所有旧答案并编写新答案。但是我的系统有软删除,所以删除的条目并没有真正删除,只是用删除日期标记。如果我这样做,数据库表会增长得非常快,因为每次用户进行更新时它都会写入几十个新条目。

我能想到的另一种方法是在两次迭代中进行:第一次将保存的值与新值进行比较,如果找不到匹配项则删除保存的值。第二次迭代将新值与旧值以及缺少的所有值进行比较。

但也许还有更实用、更有效的方法?

【问题讨论】:

  • 您不应将多个值放在同一列值中。您应该有一个表格,每个问题+答案都有一个单独的行,问题表格有一个外键。
  • 查看规范化
  • 如果 question_id 为 0,则使用设置为原始行 id 的 question_id,并且 parent_id 列所有编辑都会创建新行,通过 parent_id 链接回原始 question_id 和以前的编辑,那么它只是一种情况在选择上按顺序排序/分组

标签: php arrays database symfony


【解决方案1】:

您可以使用 symfony 属性访问器组件为您处理差异计算。

在你的问题对象上,你必须实现 getAnswers() 方法来读取值,addAnswer($answer) 方法来添加单个答案,removeAnswer($answer) 来删除单个答案。

然后,在您的控制器/服务/命令中,您必须注入属性访问器 (PropertyAccessorInterface) 并调用 $propertyAccess->setValue($question, 'answers', $newAnswers);

这将仅针对更改的值调用加法器和删除器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多