J'ai un tableau multidimensionnel ou imbriqué, je ne suis pas sûr du mot correct. Le fait est que j'essaie de rechercher une clé spécifique, de renvoyer sa valeur et de la stocker dans ma base de données en une seule itération. C'est ce que j'ai essayé mais cela me crée beaucoup de lignes dans ma base de données alors que j'ai juste besoin de 1.
array:31 [
0 => array:1 [
"ON" => "60"
]
1 => array:1 [
"QB" => "46"
]
Voici les données sur la variable $ arr:
$arr = $json['confirmed_by_province'];
foreach ($arr as $province) {
$confirmedByStates = new ConfirmedByProvinces();
foreach ($province as $key => $value) {
if($key == 'ON') {
$confirmedByProvinces->ontario = $value;
}
if($key == 'QB') {
$confirmedByProvinces->quebec = $value;
}
$confirmedByProvinces->save();
}
};
3 Réponses :
utilisez la méthode $ confirmByProvinces-> save (); en dehors du tableau $ province .
foreach ($arr as $province) {
$confirmedByStates = new ConfirmedByProvinces();
foreach ($province as $key => $value) {
if($key == 'ON') {
$confirmedByProvinces->ontario = $value;
}
if($key == 'QB') {
$confirmedByProvinces->quebec = $value;
}
}
$confirmedByProvinces->save();
};
Merci beaucoup pour votre réponse et l'explication de @james était vraiment sympa. Je voudrais ajouter que même si j'ai fait ce que vous avez suggéré, j'ai également dû déplacer ma nouvelle déclaration de modèle en dehors de la boucle for.
Le problème vient de votre boucle, si nous nous arrêtons réellement et regardons ce qui se passe, cela aura beaucoup plus de sens:
foreach ($arr as $province) {
//...
$confirmedByProvinces->save();
Pour chaque itération, vous créez un nouveau modèle appelé ConfirmedByProvinces:
foreach ($arr as $province) {
$confirmedByStates = new ConfirmedByProvinces();
//...
À la fin de chaque itération, vous appelez alors save () : p >
foreach ($arr as $province) {
$confirmedByStates = new ConfirmedByProvinces();
foreach ($province as $key => $value) {
if($key == 'ON') {
$confirmedByProvinces->ontario = $value;
}
if($key == 'QB') {
$confirmedByProvinces->quebec = $value;
}
$confirmedByProvinces->save();
}
};
Comme vous pouvez maintenant le voir, chaque itération de la boucle externe créera une nouvelle instance de votre modèle ConfirmedByProvinces , puis l'enregistrera sur la boucle interne, résultant dans plusieurs lignes pour autant d'entrées qu'il y a dans votre tableau.
La réponse de @ DilipHirapara résoudra votre problème, mais j'ai pensé qu'une explication plus approfondie expliquerait clairement pourquoi c'était un problème au départ.
Vous avez mon +1. explication parfaite :)
Merci pour l'explication, cela m'aide vraiment à mieux comprendre où était mon erreur et aussi ce que je faisais exactement
Évitez autant que dans vos actions Power DB dans la boucle foreach. Dans le cas présent, vous pouvez définir tout de la boucle dans le tableau et l'enregistrer dans la base de données dans une requête à la place:
$insert = [];
foreach ($arr as $k => $province) {
foreach ($province as $key => $value) {
if ($key == 'ON') {
$insert[$k]['ontario'] = $value;
}
if ($key == 'QB') {
$insert[$k]['quebec'] = $value;
}
}
// add timestamps here if needed since insert() method doesn't make that automatically
// $insert[$k]['created_at'] = \Carbon\Carbon::now();
// $insert[$k]['updated_at'] = \Carbon\Carbon::now();
}
if (!empty($insert)) {
$confirmedByStates = new ConfirmedByProvinces();
$confirmedByStates->insert($insert); // one I/O with DB
}
Il vous suffit de déplacer le
$ confirmByProvinces-> save ();en dehors de la boucleforeach.Vous n'avez jamais
$ arr = [0 => ['ON' => '60', 'QB' => '46'], ['ON' => '52', 'QB' => '38 ']]- les deux ensemble sous un élément du tableau extérieur - en d'autres termes, il n'y a toujours qu'un seul de ce choix dans l'élément?@DanielJonguitud Si vous répondez à cette question, je pourrais peut-être vous fournir une solution plus rapide. La question est: les éléments du tableau 31 peuvent-ils avoir les deux clés?
@Tpojka C'est en fait un tableau avec 31 clés qui contient une autre clé. J'ai résolu mon problème et j'ai marqué la solution. Merci pour votre aide!
Peut-être trouvez-vous quelque chose d'intéressant dans ma réponse, qui sait. :)