2017-02-26 190 views
0

我使用此函數以用戶角色和組返回用戶。對象數組返回相同的值

我想返回具有正確索引的對象數組,這就是爲什麼我創建$ index計數器的原因。

這裏的問題是,如果一個用戶擁有多於一組的用戶,我會得到重複的用戶。

因此,例如,如果我有一個用戶與3組,我會得到該用戶3次。

如何避免重複的用戶?

我知道,不知何故,我需要檢查,如果該用戶已經存在,就像我檢查角色,但我不知道在哪裏。

此代碼將工作,如果我代替用戶[「$指數」]與用戶[「的$ id」],但是,這種方式我不會以正確的指數陣列,而這正是我需要的。

$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 
     JOIN user_role as ur 
     ON u.id = ur.userId 
     LEFT 
     JOIN user_group as ug 
     on ug.userId = u.id 
     LEFT 
     JOIN control_group as cg 
     on cg.id = ug.groupId 
    WHERE u.id != ?"); 
    $stmt->bind_param("i", $_SESSION["id"]); 
    $stmt->execute(); 
    $stmt->bind_result($id, $firstName, $lastName, $email, $phoneNumber, 
     $address, $birthDate, $roleName, $groupId, $groupName); 
    $users = array(); 

    $index = 0; 

    while ($stmt->fetch()) { 
     if (empty($users[$index])) { 
      $users[$index] = array(
       'id' => $id, 
       'firstName' => $firstName, 
       'lastName' => $lastName, 
       'email' => $email, 
       'phoneNumber' => $phoneNumber, 
       'address' => $address, 
       'birthDate' => $birthDate, 
       'roles' => array(), 
       'groups' => array() 
      ); 
     } 
     if ($roleName) { 
      $found = false; 
      foreach ($users[$index]['roles'] as $role) { 
       if($role['roleName'] == $roleName){ 
        $found = true; 
        break; 
       } 
      } 
      if($found == false) 
       $users[$index]['roles'][] = array(
        'roleName' => $roleName 
       ); 
     } 

     if ($groupId) { 
      $found = false; 
      foreach ($users[$index]['groups'] as $group) { 
       if($group['groupName'] == $groupName){ 
        $found = true; 
        break; 
       } 
      } 
      if($found == false) 
       $users[$index]['groups'][] = array(
        'groupName' => $groupName 
       ); 
     } 
     $index++; 
    } 

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

所以基本上我希望反對這樣

{ 
     "id":2, 
     "firstName":"Jon", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"0621-123-444", 
     "address":"Address 12a", 
     "birthDate":"1976-01-01", 
     "roles":['list of role objects'], 
     "groups":['list of group objects'] 
    } 

而且我不知道,如果我產生對正確的方法的對象,我想,如果有人能告訴我什麼是正確的方法和如何正確生成這樣的對象。

+0

可以共享輸出? – gaurav

+0

我得到像這樣的輸出https://paste.ofcode.org/4irsgF4s4qcnerArP29NfA,正如你可以看到用戶馬克有2個組,這就是爲什麼他顯示2倍的原因... –

+0

@ SuperMario'sYYY從你的查詢你提取一個用戶或許多用戶的數據....並且你的意思是它爲一個用戶返回3行...? – Naincy

回答

0

在我看來,一旦你的用戶和數據庫組使用的連接,您必須爲同一用戶多個索引,你不能改變這一事實。

所以,你有兩個選擇。 - 您可以使用user_id並將數組和角色統一到數組中 - 或者您可以使用user_id代替索引,並以與使用列表相同的方式爲用戶構建索引列表角色

但是,如果您真的需要知道您在數據庫中獲得的每個用戶的索引,則只需執行此操作。

我需要了解情況或用戶故事有一個更準確的概念

OK,我嘗試是這樣的:

$index = 0; 
$temp_index = 0; 
$user_index =[] 
while ($stmt->fetch()) { 

    if (empty($user_index[$id])){ 
     $user_index[$id] = $index; 
    }else{ 
     $temp_index = $index; 
     $index = $user_index[$id]; 
    } 

    if (empty($users[$index])) {   
     $users[$index] = array(
      'id' => $id, 
      'firstName' => $firstName, 
      'lastName' => $lastName, 
      'email' => $email, 
      'phoneNumber' => $phoneNumber, 
      'address' => $address, 
      'birthDate' => $birthDate, 
      'roles' => array(), 
      'groups' => array() 
     ); 
    } 
    if ($roleName) { 
     $found = false; 
     foreach ($users[$index]['roles'] as $role) { 
      if($role['roleName'] == $roleName){ 
       $found = true; 
       break; 
      } 
     } 
     if($found == false) 
      $users[$index]['roles'][] = array(
       'roleName' => $roleName 
      ); 
    } 

    if ($groupId) { 
     $found = false; 
     foreach ($users[$index]['groups'] as $group) { 
      if($group['groupName'] == $groupName){ 
       $found = true; 
       break; 
      } 
     } 
     if($found == false) 
      $users[$index]['groups'][] = array(
       'groupName' => $groupName 
      ); 
    } 
    if ($tempo_index != 0){ 
     $index = $temp_index; 
     $temp_index = 0; 
    }else{ 
     $index ++; 
     $temp_index = 0; 
} 
+0

我不知道,如果我完全理解你的意思,但基本上我只是想返回具有正確索引的用戶列表,所以例如,如果我有4個用戶我想返回數組與起始索引0,如果我使用用戶ID,我會得到對象的數組,但沒有正確的索引,而是我會得到userId作爲索引,我不希望這樣。 –

+0

比不使用索引只是使用'$ users []'輸入用戶數組 – gaurav

+0

嗯我不知道我可以做到這一點,因爲用戶有多個角色和組,並且我需要將其提取到用戶對象? –

1

如果執行多個查詢是一種選擇,你能先取得所有用戶,然後是每個用戶的角色和組。

$user_stmt = $mysqli->prepare("SELECT id, firstName, lastName, email, phoneNumber, address, birthDate FROM users WHERE id != ?"); 
$user_stmt->bind_param("i", $_SESSION["id"]); 
$user_stmt->execute(); 
$user_stmt->bind_result($id, $firstName, $lastName, $email, $phoneNumber, $address, $birthDate); 

$role_stmt = $mysqli->prepare("SELECT roleName FROM user_role WHERE userId = ?"); 
$group_stmt = ... 

$users = array(); 

while($user_stmt->fetch()) 
{ 
    $role_stmt->bind_param("i", $id); 
    $role_stmt->execute(); 
    $role_stmt->bind_result($roleName); 

    $roles = array(); 

    while($role_stmt->fetch()) 
    { 
     $roles[] = array("roleName" => $roleName); 
    } 

    $groups = array(); 

    // Same as for roles 

    $users[] = array(
      'id' => $id, 
      'firstName' => $firstName, 
      'lastName' => $lastName, 
      'email' => $email, 
      'phoneNumber' => $phoneNumber, 
      'address' => $address, 
      'birthDate' => $birthDate, 
      'roles' => $roles, 
      'groups' => $groups 
     ); 
    } 
} 

$user_stmt->close(); 
$role_stmt->close(); 
$group_stmt->close(); 
$mysqli->close(); 
echo json_encode($users); 
+0

我認爲,但在性能方面有多好的解決方案,在此方式我有一個數據庫調用,那樣我需要2或3取決於對象的外觀。所以我的主要問題是,使用連接還是多個簡單查詢有更好的方法? –