0

我正在寻找将更改保存到数据库的复选框列表的最佳方法。这是我的设置:

根据一些数据库条目,我有一个选中或未选中的复选框列表,例如:

Animals I like: 
0 Cats 
X Dogs
0 Birds
X Elefants

现在用户可以完全改变他/她的想法并选择Birds和取消选择Dogs,我想尽可能有效地将此更改保存在数据库中。

数据库的结构方式是,我有一个用户表(带有 user_id)和一个动物表(带有 animal_id)。“喜欢”在数据透视表中进行跟踪(因为它是多对多关系)。

以下是我考虑过的一些方法,但我对任何其他/更好/更有效的方法感兴趣:

1) 保存时,删除该用户数据透视表中的所有条目,并仅输入选中的条目。

这样做的好处是我不需要比较很多之前/之后的选择。缺点是我删除了一个没有改变的条目(即上面例子中的elefants)。例如,如果我将创建时间戳附加到 elefant 之类的东西上,它每次都会更改,即使我没有更改该选择

2)保存时,我查询数据库以获取所有原始喜欢的列表。我将此列表与新的新喜欢进行比较。每次我遇到一个不在新列表中的原始喜欢时,我都会将其删除。如果我遇到一个不在原始列表中的新的,我会添加它。

这具有仅更改对数据库的更改的优点,但它看起来像一个非常多的查询。如果动物列表很长并且进行了许多更改,则循环可能会导致大量数据库事务。

那么,解决这个问题的最佳实践是什么。我的意思是,这一定是一个普遍的问题,我不想在这里重新发明轮子。

4

2 回答 2

1

选项 1 是最好的,但由于您不希望时间戳受到干扰,因此您可以做一个比“单独检查每条记录”更有效的系统。

1) 从数据库 $original 中获取用户选择的列表。

2) 从提交的表单中获取选项列表,$submitted。

3) 使用 array_diff() 找出发生了什么变化以及你需要对数据库做什么:

例如

$original = array(2,4,6,8);
$submitted = array(4,7,8);
// so 2 and 6 have been removed, and 7's been added.

$unchanged = array_intersect($original, $submitted); // 4, 8
$removed = array_diff($original, $submitted); // 2, 6
$added = array_diff($submitted, $original); // 7

$sql = "DELETE FROM pivot_table WHERE animal_id IN (2, 6);"; // remove 2&6
$sql = "INSERT INTO (animal_id, ...) VALUES (7, ...)"; // insert 7
于 2013-01-24T20:22:09.347 回答
0

当您最初向用户提供选择时,您已经完成了数据库查询以显示她/他已经检查过的内容。现在您可以将更改与原始版本进行比较。如果有变化,请更新,否则,不要管它。

于 2013-01-24T19:37:01.230 回答