我正在寻找将更改保存到数据库复选框列表的最佳方法。这是我的设置:
根据某些数据库条目,我有一个选中或取消选中的复选框列表,如下所示:
Animals I like:
0 Cats
X Dogs
0 Birds
X Elefants
现在,用户可以完全改变主意并选择Birds
并取消选择Dogs
,我希望尽可能高效地将此更改保存在数据库中。
db的结构方式,我有一个用户表(带有user_id)和一个动物表(带有animal_id)。在“数据透视表”中跟踪“喜欢”(因为它是多对多关系)。
以下是我考虑过的一些方法,但我对其他/更好/更有效的方法感兴趣:
1)在保存时,删除此用户的数据透视表中的所有条目,并仅输入选中的条目。
这样做的好处是我不需要比较之前/之后的选择。缺点是我删除了一个没有改变的条目(即上例中的元素)。如果我将创建时间戳附加到例如elefant,它会每次都改变,即使我不改变那个选择
2)在保存时,我查询数据库以获取所有原始喜欢的列表。我将此列表与新喜欢的新列表进行比较。每当我遇到原始的,不在新列表中时,我将其删除。如果我遇到原始列表中没有的新内容,我会添加它。
这样做的好处是只更改了db的更改,但它似乎是一个非常多的查询。如果动物列表很长并且进行了许多更改,则循环可能会导致大量的数据库事务。
那么,解决这个问题的最佳做法是什么。我的意思是,这一定是一个常见的问题,我不想在这里重新发明轮子。
答案 0 :(得分:1)
选项1将是最好的,但由于您不希望时间戳受到干扰,因此您可以使用比“单独检查每条记录”更高效的系统。
1)从db,$ original。
中获取用户选择的列表2)从提交的表格中提取选项列表,$ submitted。
3)使用array_diff()来确定改变了什么以及你需要对数据库做什么:
e.g。
$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
答案 1 :(得分:0)
当您最初向用户显示选项时,您已完成数据库查询以显示他/她已检查的内容。现在,您可以将更改与原始更改进行比较。如果发生了变化,请更新,否则,请不要管它。