2017-02-06 100 views
2

我有這個PHP函數的問題,我試圖用他的角色和組獲取用戶,它的角色工作良好,但我有組的問題,因爲我得到相同的數組組,當然我想要的是重複的自由數組。我明白爲什麼我得到這個,因爲我的用戶有2個角色,我讓他在SQL查詢2次,誰能解釋我什麼是最佳實踐,以及如何避免這種情況,我應該使用這樣的查詢,或者我可以使用另一種查詢在哪裏我會找到所有組的成員,然後把它放在該數組中,但這是2個DB調用一個函數,它可能不是那麼好的解決方案。從多個到多個PHP獲取

function getAll($mysqli) { 
    $stmt = $mysqli->prepare("SELECT u.id, u.firstName, u.lastName, u.email, 
     u.phoneNumber, u.address, u.birthDate, ur.roleName, cg.id, cg.name FROM users as u 
     LEFT OUTER JOIN user_role as ur ON u.id = ur.userId 
     LEFT OUTER JOIN user_group as ug on ug.userId = u.id 
     LEFT OUTER JOIN control_group as cg on cg.id = ug.groupId"); 

    $stmt->execute(); 
    $stmt->bind_result($id, $firstName, $lastName, $email, $phoneNumber, 
     $address, $birthDate, $roleName, $groupId, $groupName); 
    $users = array(); 

    while ($stmt->fetch()) { 
     if (empty($users[$id])) { 
      $users[$id] = array(
       'id' => $id, 
       'firstName' => $firstName, 
       'lastName' => $lastName, 
       'email' => $email, 
       'phoneNumber' => $phoneNumber, 
       'address' => $address, 
       'birthDate' => $birthDate, 
       'roles' => array(), 
       'groups' => array() 
      ); 
     } 
     if ($roleName) { 
      $users[$id]['roles'][] = array(
       'roleName' => $roleName 
      ); 
     } 
     if ($groupId) { 
      $users[$id]['groups'][] = array(
       'groupName' => $groupName 
      ); 
     } 
    } 

    $stmt->close(); 
    $mysqli->close();; 
    echo json_encode($users); 
} 

當我執行該功能我得到這樣

{ 
    "1":{ 
     "id":1, 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"062-441234-123123", 
     "address":"Some Address 40\/2", 
     "birthDate":"1989-12-29", 
     "roles":[ 
     { 
      "roleName":"Admin" 
     }, 
     { 
      "roleName":"User" 
     } 
     ], 
     "groups":[ 
     { 
      "groupName":"Group 1" 
     }, 
     { 
      "groupName":"Group 1" 
     } 
     ] 
    }, 
    "2":{ 
     "id":2, 
     "firstName":"Jane", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"0112-11121-221322", 
     "address":"Address 21ca", 
     "birthDate":"1975-12-28", 
     "roles":[ 
     { 
      "roleName":"Admin" 
     }, 
     { 
      "roleName":"User" 
     } 
     ], 
     "groups":[ 

     ] 
    } 
} 

回答

1

響應您可以檢查是否一個角色(或一組)在數組中插入之前已經存在:

if ($roleName) { 
    $found = false; 
    foreach ($users[$id]['roles'] as $role) { 
     if($role['roleName'] == $roleName){ 
      $found = true; 
      break; 
     } 
    } 
    if($found == false) 
     $users[$id]['roles'][] = array(
      'roleName' => $roleName 
     ); 
} 

注意我給你一個基於你的結構的答案。但我強烈建議改變陣列的結構,以檢查角色的存在是否快速O(1)

編輯:爲了完成我的答案:我會說JSON結構不反映什麼真實的情況是。您聲明用戶具有角色和組,但這是真實的,但角色屬於該組。用戶可以在第1組的管理員和任何在第2組這就是爲什麼我認爲你應該輸出什麼是這樣的:

{ 
    "1":{ 
     "id":1, 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"062-441234-123123", 
     "address":"Some Address 40\/2", 
     "birthDate":"1989-12-29", 
     "groups":[ 
     { 
      "groupName": "Group 1", 
      "roles": [ 
       { 
        "roleName":"Admin" 
       }, 
       { 
        "roleName":"User" 
       } 
      ] 
     } 

     ] 
    }, 
    "2":{ 
     "id":2, 
     "firstName":"Jane", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"0112-11121-221322", 
     "address":"Address 21ca", 
     "birthDate":"1975-12-28", 
     "groups":[ 

     ] 
    } 
} 
+0

角色都工作正常,我有問題同組,即時知道爲什麼羣體不像角色一樣工作其基本相同的情況 –

+0

如果你有一個用戶在不同的組中具有相同的角色,它將無法工作。試試吧,你會看到它是如何被複制的。 – barbarity

+0

另外,如果你想我的誠實的意見......只有通過我可以看看,我感覺數據庫沒有反映你的業務邏輯或JSON的結構不(或兩者兼而有之)。 – barbarity