2016-04-29 88 views
0

我將盡我所能去嘗試解釋這一點。我有一個包含多種角色類型的應用程序。在這種情況下唯一重要的兩個是'經理'和'代表'。創建代表時,他們被分配到該公司內的一個或多個管理人員(公司在創建經理時被分配)。請注意,所有用戶都存儲在名爲「用戶」的同一個表中。基於陣列比較的SQL刪除,更新或插入

當創建管理者關係的代表時,代表和管理者的主鍵的PRIMARY KEY(在我的情況下,用戶表中的用戶表中的userId)被推送到名爲ManagerRepRelationship 。因此,舉例來說,如果我有以下的用戶表(只打算用在這種情況下重要的COLS工作):

userId | username |  role  | accountId | 
______ ________ ______________ _________ 
    1  jsmith  manager   14 
    2  mfoster  manager   14 
    3  lcarter  manager   18 
    4  jdoe  representative 14 
    5  tlarson  representative 18 
    6  rhoward  representative 18 

代表,所以如果上面表看起來只能被分配到一個經理帳戶內這樣,ManagerRepRelationship可能看起來像:

repId | managerId 
_____ _________ 
    4  1 
    5  3 
    6  3 

我遇到麻煩的是,當涉及到編輯這些關係。目前我有一個單獨的表單和頁面JUST來處理這些關係的變化,因爲它將是一個非常有限的頁面。假設在這種情況下,我們要編輯代表jdoe併爲他分配另一位經理。目前他只被分配到jsmith,但我們想給他兩個經理,所以我們也將他分配給mfoster。在這種情況下,頁面的URL會是這樣的:

http:localhost:8888/mod-super-admin/edit-relatoinship.php?repId=4&accountId=14

在頁面的頂部,我搶爲該帳戶(請注意下面的查詢地址表中的所有管理人員僅僅是在我爲用戶提供個人信息,它與這個問題沒有任何關係,你會注意到我在上面的Users表中沒有包含addressId,我沒有更新這個頁面上Address表的任何內容,我只想要第一個和

// Get the url variables 
$rep_id = $_GET["repId"]; 
$account_id = $_GET["accountId"]; 

// grab all managers tied to the account (not the rep) 
$manager_sql = "SELECT Users.userId, Address.firstName, Address.lastName FROM Users JOIN Address ON Users.addressId=Address.addressId WHERE Users.role='manager' AND Users.accountId=" . $account_id; 
$account_managers = mysqli_query($connection,$manager_sql); 

// grab all managers assigned to the rep 
$relationship_sql = "SELECT managerId FROM ManagerRepRelationship WHERE repId=" . $rep_id; 
$rep_rels = mysqli_query($connection, $relationship_sql); 

// create and array that houses current assigned managers 
$current_managers = array(); 
while($row = mysqli_fetch_array($rep_rels)){ 
    array_push($current_managers, $row["managerId"]); 
} 

表格如下。如果已經分配,​​它將突出顯示經理。

<form method="POST" action="./mod-super-admin/edit-relationship.php?repId=<?php echo $rep_id; ?>&accountId=<?php echo $account_id; ?>"> 
      <div class="col-sm-12"> 
       <div class="form-group"> 
       <div class="form-group mbs"> 
        <label for="manager" class="label-medium">Assigned Managers</label><br> 
        <small>To Select Multiple Managers Hold Down CTRL (CMD for Mac) and click</small> 
        <select name="manager[]" class="form-control input-medium" multiple="multiple"> 
        <?php 
         $output; 
         while($manager = mysqli_fetch_assoc($account_managers)) : 
         $output .= '<option value="' . $manager["userId"] . '"'; 
         foreach($current_managers as $key=>$value) : 
          if($value === $manager["userId"]){ 
          $output .= ' selected'; 
          } 
         endforeach; 
         $output .= '>' . $manager["lastName"] . ', ' . $manager["firstName"] . '</option>'; 
         endwhile; 
         echo $output; 
        ?> 
        </select> 
       </div> 

       <input type="submit" name="editRelationshipSubmit" class="btn btn-large btn-green mtm" value="Update Relationship"> 
       </div> 
      </div> 

      </form> 

在我們的情況下,上述PHP將輸出和經理的名字,如果經理被分配到代表將已經強調了mutliselect。這裏是我遇到麻煩的部分。當涉及到編輯這些realtionships。例如,我明白,如果我只是將mfoster作爲經理添加到jdoe我只需要運行,INSERT INTO就可以在ManagerRepRelationship上,或者如果我要刪除jsmith作爲經理,我會運行DELETE FROM ManagerRepRelationship WHERE repId=4 AND managerId=1

如何彌補發生的事情?我不知道如果當前正在進行這些更改的用戶將添加經理關係,刪除經理關係,也許他們會做一些這兩者。

我製作了$current_managers數組,因此我可以在提交表單時對照數組$_POST["manager"];進行檢查。我應該注意到,陣列中唯一的數據是userId。我只是堅持運行不同的SQL命令來根據這些數組的比較來更新我的數據庫。我希望我做了一個解釋我所處狀況的好工作。

+0

太長的問題:0 –

+0

@HamzaZafeer好,如果我沒有提供細節我會被告知「信息不足」 –

回答

2

我覺得這是一個相當普遍的問題。我總是解決這種問題的方式可能有點簡單,但它的工作原理和實施起來都很簡單。與其試圖弄清楚發生了什麼變化(例如刪除2個管理員,添加1個,保留1),然後插入/刪除正確的行,我總是採取簡單地刪除所有現有行然後插入整個集與用戶輸入的數據有關的全新數據。

所以在你的情況下,讓我們說,用戶選擇代表4,然後編輯選定的經理,以便他們選擇經理3,7和8(N.B.以前選擇什麼是不相關的)。所以,那麼你對數據庫運行如下:

delete from ManagerRepRelationship where repId = 4; 
insert into ManagerRepRelationship (repId, managerId) values (4, 3); 
insert into ManagerRepRelationship (repId, managerId) values (4, 7); 
insert into ManagerRepRelationship (repId, managerId) values (4, 8); 

顯然,你想使用一個循環,基於你的GUI選擇的值插入語句。

這樣你就不用擔心比較之前到現在有什麼。

P.S.確保在所有SQL操作周圍使用事務,以便在處理過程中發生錯誤時不會卡住錯誤的信息。

+0

哇,我甚至沒有想到這是一個選項!這太聰明瞭,可以減少很多代碼/工作。非常感謝你的想法,我確切知道該從哪裏出發。回答問題併爲我的朋友UpVote。 –

+0

樂意提供幫助。祝你好運! – ADyson