2017-02-26 136 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取决于对象的外观。所以我的主要问题是,使用连接还是多个简单查询有更好的方法? –