4 votes

Comment ajouter des informations de la base de données à un tableau existant d'objets ?

J'ai un tableau dans le format suivant;

// echo '' . var_export($this->viewableFields, true) . '';

array (
  0 => 
  (object) array(
     'formId' => '4',
     'userId' => '7'
  ),
  1 => 
  (object) array(
     'formId' => '4',
     'userId' => '4'
  )
) 

Je dois modifier les données et ajouter une autre paire clé/valeur à ce tableau. Je dois utiliser la valeur de userId du tableau, interroger une base de données MySQL et retourner la valeur. Je dois faire cela pour chaque élément du tableau.

Donc pour chaque élément du tableau, je veux exécuter une requête comme;

SELECT group from users WHERE userId = [userId dans le tableau]

Je veux ensuite ajouter cette valeur au tableau, le tableau final devrait ressembler à ceci;

array (
  0 => 
  (object) array(
     'formId' => '4',
     'userId' => '7',
     'group' => 'Enregistré'
  ),
  1 => 
  (object) array(
     'formId' => '4',
     'userId' => '4',
     'group' => 'Admin'
  )
) 

Je sais que je peux ajouter une valeur supplémentaire aux éléments du tableau en utilisant array_walk, comme ceci;

array_walk($this->viewableFields, function(&$arr) {
    $arr->group = 'Enregistré';
});

Je ne suis pas sûr comment récupérer les valeurs de la base de données et les insérer dans le tableau existant.

Comment puis-je réaliser cela?

4voto

yivi Points 3635

Faire une requête supplémentaire pour chaque enregistrement est une très mauvaise idée, et un exemple clair du problème N+1 : où vous avez besoin d'obtenir "N" enfants d'une entité, et seul l'entité parent a été récupérée initialement.

Si votre requête initiale comporte 100 utilisateurs, vous finirez par faire 101 requêtes. Si vous avez besoin plus tard d'un autre champ non lié, cela commence à devenir rapidement incontrôlable.

C'est très mauvais pour les performances, et à mesure que votre application devient plus complexe, cela peut avoir un impact très grave pour celle-ci.

En supposant que vous ne pouvez pas modifier la requête initiale et faire une simple requête de JOIN pour récupérer les données requises, il vaut mieux simplement faire deux requêtes et assembler les données résultantes. Même si vous pouvez modifier la requête d'origine, cela pourrait finir par être plus performant.

Comment procéder :

En supposant que vous avez votre tableau initial d'objets avec des propriétés publiques formId et userId, récupérez d'abord tous les IDs utilisateur qui vous intéressent :

$index = [];
$ids = array_reduce($array, function($ids, $object) use (&$index) {
    $ids[]                  = $object->userId;
    $index[$object->userId] = $object;

    return $ids;
});

$ids_for_sql = '(' . implode(', ', $ids) . ')';

Vous construisez également un "index" ($index) pour pouvoir accéder directement aux objets dans le tableau sans avoir à le parcourir encore une fois.

Vous pouvez maintenant faire la deuxième requête dont vous avez besoin pour obtenir votre propriété "groupe" :

$groups_query = "SELECT userId, group from users WHERE userId IN $ids_for_sql";

Il suffit maintenant de "réunir" les données des deux requêtes :

foreach ($conn->query($groups_query) as $row) {
    $index[$row['userId']]->group = $row['group'];
}

Avec cela, votre tableau initial $array contenant des objets "utilisateur" sera correctement mis à jour, et ne fera que 2 requêtes au lieu de 11. Cela est plus performant et évolutif, sans ajouter une complexité significative.

Vous pouvez voir une démo simple et fonctionnelle (avec des tableaux au lieu de requêtes SQL) ici.

1voto

Tout d'abord, nous allons obtenir la valeur de l'ID d'utilisateur à partir du tableau d'objets, puis la requêter dans la base de données, en supposant que le tableau est $arr.

foreach($arr AS $key=>$item) 
{
    $userid=$item["userId"];  // obtenir l'ID d'utilisateur de l'objet
    $query= $con->query("SELECT group from users WHERE userId='$userid'");
    if($query->num_rows>0)  // vérifier si la requête a des résultats
    {
        $row=$result->fetch_assoc();      // récupérer le résultat
        $arr[$key]->group=$row['group'];  // enfin attacher la clé de groupe au tableau.
    }
}

-2voto

Marty1452 Points 402

Vous devez foreach des éléments, obtenir l'identifiant de l'élément du tableau, puis sélectionner les données avec SQL.

Essayer :

foreach($array as $key=>$item) {
    $sql = "SELECT groupe from utilisateurs WHERE userId = ".$item["userId"];
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        $db_data = $result->fetch_assoc();
        //faire quelque chose avec les données de la base de données

        $array[$key]["group"] = $group; //insérer le groupe dans cette variable
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X