2017-02-26 7 views
0

Ich benutze diese Funktion, um Benutzer mit ihren Rollen und Gruppen zurückzugeben.Array von Objekten gibt dieselben Werte zurück

Ich möchte Array von Objekten mit korrekten Index zurückgeben, das ist der Grund, warum ich $ Indexzähler erstellt.

Problem hier ist, dass ich doppelte Benutzer bekomme, wenn ein Benutzer mehr als 1 Gruppen hat.

Also zum Beispiel wenn ich einen Benutzer mit 3 Gruppen habe, werde ich diesen Benutzer 3 mal bekommen.

Wie doppelte Benutzer zu vermeiden?

Ich weiß, dass ich irgendwie überprüfen muss, ob dieser Benutzer bereits existiert, wie ich für Rollen überprüft habe, aber ich bin mir nicht sicher, wo.

Dieser Code funktioniert, wenn ich Benutzer ['$ index'] durch Benutzer ['$ id'] ersetze, aber auf diese Weise werde ich Array mit dem richtigen Index nicht bekommen, und das ist was ich brauche.

$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); 

Also im Grunde Ich mag diesen

{ 
     "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'] 
    } 

Objekt erwarte ich, dass auch mich nicht, wenn ich auf korrekte Art und Weise Objekt bin zu erzeugen, würde Ich mag, wenn jemand kann mir sagen, was richtiger Ansatz ist und wie man ein Objekt wie dieses richtig erzeugt.

+0

Können Sie die Ausgabe teilen? – gaurav

+0

Ich bekomme Ausgabe wie folgt https://paste.ofcode.org/4irsgF4s4qcnerArP29NfA, wie Sie Benutzer Mark haben 2 Gruppen sehen, das ist der Grund, warum er 2 mal angezeigt wird ... –

+0

@ SuperMario'sYoshi von ur Abfrage r Sie holen Daten eines Benutzers oder vieler Benutzer .... und meinst du es gibt 3 Zeilen für einen Benutzer zurück ...? – Naincy

Antwort

0

Meiner Meinung nach, sobald Sie Benutzer und Datenbankgruppen mit Joins erhalten, haben Sie mehr als einen Index für den gleichen Benutzer und Sie können diese Tatsache nicht ändern.

Sie haben also zwei Möglichkeiten. -Sie können user_id verwenden und die Gruppen und Rollen in einem Array vereinheitlichen. -Oder Sie können user_id anstelle des Indexes verwenden und eine Liste von Indizes für den Benutzer erstellen, so wie Sie eine Liste von Rollen

Aber Sie müssen das nur tun, wenn Sie wirklich den Index jedes Benutzers wissen müssen, den Sie in der Datenbank erhalten.

Ich brauche den Kontext oder die User Story zu verstehen, um eine genauere Vorstellung

OK haben, ich so etwas wie dieses Versuchen:

$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

Ich bin mir nicht sicher, ob ich völlig verstehe, was meinst du, aber im Grunde möchte ich nur Liste der Benutzer mit korrekten Index zurückgeben, so zum Beispiel, wenn ich 4 Benutzer habe ich Array mit Start Index 0 zurückgeben, wenn ich benutze Benutzer-ID, ich bekomme Array von Objekten, aber ohne korrekten Index, stattdessen werde ich userId als Index und ich will das nicht. –

+0

als Index nicht verwenden Sie einfach '$ users []' zur Eingabe in Benutzer-Array – gaurav

+0

Hmm ich bin nicht sicher, wie ich es tun kann, weil Benutzer mehrere Rollen und Gruppen haben, und ich muss es in Benutzerobjekt holen? –

1

Wenn mehrere Abfragen durchführen eine Option könnten Sie zuerst bekommen alle Benutzer und dann pro Benutzer die Rollen und Gruppen.

$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

Ich dachte das, aber in Bezug auf die Leistung, wie gute Lösung ist, dass auf diesem So habe ich einen DB Anruf und auf diesem Weg brauche ich 2 oder 3 hängt davon ab, wie Objekt aussehen. Also ist mein Hauptproblem hier, ist es besser, eine große Abfrage mit Joins oder mehrere einfache Abfragen zu haben? –

Verwandte Themen