MySQL更新“链接”表

时间:2016-07-05 16:17:34

标签: php mysql

我有一张桌子users和一张桌子salesmen 我想将销售人员分配给用户。一个销售人员可以链接到多个用户。

所以我使用列users_salesmenuser_id创建了salesmen_id“链接”表。

我有一个可以链接它们的页面

       | Salesemen 1|  Salesmen 2 | Salesmen 3 |
-------|------------|-------------|------------|
User 1 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|
User 2 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|
User 3 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|

该复选框位于HTML中:

<input type="checkbox" name="user_id[6][]" value="3" />

值为salesmen_id

如何链接的一个例子:

       | Salesemen 1|  Salesmen 2 | Salesmen 3 |
-------|------------|-------------|------------|
User 1 |     x      |             |     x      |
-------|------------|-------------|------------|
User 2 |            |     x       |            |
-------|------------|-------------|------------|
User 3 |            |     x       |     x      |
-------|------------|-------------|------------|

这将导致users_salesmen

salesmen_id  |   user_id
------------ |------------
    1        |     1
    2        |     2
    2        |     3
    3        |     1
    3        |     3 

所以我的问题是,在我做了一些更改之后如何更新表格 我一直这样做:

  • 删除users_salesmen
  • 中的所有行
  • 循环输入,已检查的人插入users_salesmen

这是正确的方法,还是有更好的方法来更新数据?

4 个答案:

答案 0 :(得分:1)

你说&#34;一个推销员可以链接到多个用户。&#34;。如果这是真的,反之亦然(&#34;一个用户可以链接到多个推销员&#34;),那么以下是一个很好的解决方案。

有一个&#39; salesman_id&#39;您的users表中的列,只需将salesman ID添加到相关用户行。然后,您的销售人员表将只有销售员详细信息及其ID - 用户表将包含分配给他们的销售员的ID。每个销售人员可以分配多个用户。

答案 1 :(得分:1)

我同意@MarcB,你是最好的方法。无论如何,仅仅为了讨论的目的,我可以建议你使用array_diff的另一种方式来获取要添加的内容和要删除的内容:

function array_diff_ORG_NEW(&$org, &$new, $type){
    switch($type){
        case 'VALUES':
            $int = array_values(array_intersect($org, $new)); //C = A ^ B
            $org = array_values(array_diff($org, $int)); //A' = A - C
            $new= array_values(array_diff($new, $int)); //B' = B - C
            break;
        case 'KEYS':
            $int = array_values(array_intersect_key($org, $new)); //C = A ^ B
            $org = array_values(array_diff_key($org, $int)); //A' = A - C
            $new= array_values(array_diff_key($new, $int)); //B' = B - C
            break;
    }
}

这将查看键或值,并将为您提供要添加或删除的所有项目。

答案 2 :(得分:0)

更新复选框列表很痛苦,但最简单/最干净的方法基本上就是你正在做的事情:

start transaction
delete old stored checkbox data
insert all checkboxes from form
commit transaction

否则,您将无法获取旧列表,将其与新列表进行比较,并构建单独的插入/删除查询以删除任何“未选中”框并插入任何“已选中”的列表。

更容易将所有旧东西都插入并插入所有新东西。事务保证最终会得到一致的结果,并在实际提交之前隐藏其他并行代码的删除/插入。

答案 3 :(得分:0)

我认为你的手术是可行的。因为,如果允许在UI中仅更新行(在HTML中),则意味着您一次只能为单个用户更新数据。因此,在那个时候你应该只删除和重新插入该用户的数据,其他应该保持相同。 但是,如果允许您在一次调用中修改多于用户的记录,则必须删除该链接(映射)表的所有记录并重新插入。