1
votes

obtenir des doublons de whereIn - Laravel

J'essaie actuellement d'obtenir les données de la table X avec l'identifiant et le nom des colonnes. J'utilise Laravel pour le projet et y compris whereIn pour obtenir les multiples données de la table X. Son fonctionnement parfait et j'obtiens la réponse attendue lorsque j'envoie des données de demande en tant que (1,2,3,4). Mais quand j'envoie une demande en tant que (1, 2, 3, 4, 2), il fournit une réponse pour l'id 1,2,3,4 mais il ne récupère pas à nouveau les données en double qui sont pour l'id 2. Voici ma requête

 X::whereIn('id',$request->XIds)->get()->toArray();

Supposons que $ request-> XIds est [1,2,3,4,2] .. Comme 2 se répète. Ma question est de savoir comment obtenir des données en double via la requête afin que, lorsque j'envoie une demande contenant des entrées en double, je puisse obtenir une réponse avec ces données en double.


0 commentaires

5 Réponses :


-1
votes

whereIn ('id', array (1,2,3,4,2)) retournera des données qui correspondent à la valeur du champ id dans un tableau donné, donc il ne retournera pas de valeur en double, en gros il vérifie que l'identifiant est inarray ou non? si est dans le tableau, sélectionnez ces données.

Si vous avez besoin de données en double, vous devez écrire manuellement un code comme celui-ci:

$my_data=[];

 foreach($request->XIds as $id){
     $xmodel=X::where('id',$id)->first();
     if($xmodel){
       array_push($my_data,$xmodel);
     }
 }

return response()->json($my_data,200);


1 commentaires

Si vous avez 1000 identifiants, ce code exécute 1000 requêtes



0
votes

Vous devez le faire en PHP après avoir récupéré les données de la base de données.

$collection = X::whereIn('id', $request->XIds)->get()->keyBy('id');

$counts = array_count_values($request->XIds);

foreach ($counts as $id => $count) {
    if ($count === 1) {
         continue;
    }
    for ($i = 0; $i < $count - 1; $i++) {
        $collection->push($collection->get($id));
    }
}

$yourFinalArray = $collection->values()->toArray();


0 commentaires

2
votes

Eh bien, vous pouvez projeter correctement les données si vous le souhaitez:

$data = X::whereIn('id',$request->XIds)->get()->getDictionary();


return collect($request->XIds)->map(function ($id) use ($data) {
      return $data->get($id)->toArray(); 
})->all();  

Cependant, je vous suggère d'essayer de revoir un peu votre logique car il n'y a aucun avantage objectif à envoyer les mêmes données plusieurs fois.


0 commentaires

0
votes

Et voilà.

$result = X::whereIn('id', $request->XIds)->get();
$ids = $result->pluck('id')->toArray();
$resultInArray = $result->toArray();
$finalResult = collect($request->XIds)->map(function ($id) use($ids, $resultInArray) {
        return $resultInArray[array_search($id, array_values($ids))];
});


0 commentaires

1
votes

Extension de la solution @apokryfos. Pour renvoyer une collection d'objets unidimensionnelle, vous devez utiliser ->first().

$data = X::whereIn('id',$request->XIds)->get()->getDictionary();

return collect($request->XIds)->map(function ($id) use ($data) {
      return $data->get($id)->first(); 
});  

$ data output:
entrez la description de l'image ici

mappé $ sortie de données:
entrez la description de l'image ici


0 commentaires