2016-07-05 65 views
0

我有一个表users和一个表salesmen
我想分配推销员给用户。一名销售员可以链接到多个用户。MySQL更新“链接”表

所以我做了users_salesmen“链接”表与colums user_idsalesmen_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

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

回答

0

更新复选框列出是一种痛苦,但最简单的/清洁的方法,基本上你在做什么:

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

否则,你坚持让旧列表,它比较新的列表,并建立单独的插入/删除查询以删除任何“未选中”框并插入任何“已选中”的框。

只需将旧的所有东西都加以核对并插入新的东西就会更容易。事务处理保证您最终获得一致的结果,并在您实际提交之前隐藏其他并行代码的删除/插入。

+0

好的,谢谢你的确认。 – LinkinTED

1

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

在用户表中有一个'salesman_id'列,只需将该推销员ID添加到相关的用户行。您的销售人员表格将仅包含销售员详细信息和他们的ID - 用户表将包含分配给他们的销售员的ID。每个销售人员可以分配多个用户。

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; 
    } 
} 

这将着眼于双方的键或值,并会为您提供所有要添加或删除的项目。

+0

谢谢你的回答。我已经接受了马克B的答案,但给了你+1的努力!不错的选择! – LinkinTED

0

我不认为你的程序是可行的。因为,如果您只允许更新UI中的行(在您的HTML中),这意味着您一次只能为单个用户更新数据。所以,那个时候你只应该为那个用户删除并重新插入数据,其他的应该保持不变。 但是,如果允许您在一次调用中修改多于用户的记录,那么您必须删除该链接(地图)表的所有记录并重新插入它们。