2016-07-05 60 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中),這意味着您一次只能爲單個用戶更新數據。所以,那個時候你只應該爲那個用戶刪除並重新插入數據,其他的應該保持不變。 但是,如果允許您在一次調用中修改多於用戶的記錄,那麼您必須刪除該鏈接(地圖)表的所有記錄並重新插入它們。