chunk (specified number);"; données de chaque utilisateur afin qu'une grande quantité de données ne soit pas obtenue lors de l'interrogation des données, ce qui peut réduire la pression sur le système."/> chunk (specified number);"; données de chaque utilisateur afin qu'une grande quantité de données ne soit pas obtenue lors de l'interrogation des données, ce qui peut réduire la pression sur le système.">
Dans Laravel, la méthode chunk() est utilisée pour diviser une collection en plusieurs collections plus petites de tailles spécifiées. La syntaxe est "$specified collection->chunk(specified number);"; les données de chaque utilisateur après la mise à jour, de sorte qu'une grande quantité de données ne soit pas obtenue lors de l'interrogation des données, ce qui peut réduire la pression sur le système.
L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.
chunk()
méthode Chunk pour diviser une collection en plusieurs collections plus petites d'une taille donnée. Très utile pour afficher les collections dans une grille.
$prices = collect([18, 23, 65, 36, 97, 43, 81]); $prices = $prices->chunk(3); $prices->toArray();
Le code ci-dessus génère l'effet.
[ 0 => [ 0 => 18, 1 => 23, 2 => 65 ], 1 => [ 3 => 36, 4 => 97, 5 => 43 ], 2 => [ 6 => 81 ] ]
Utilisation générale
S'il y a un tel besoin : interrogez toutes les données de la base de données et effectuez une série de mises à jour
La méthode simple et grossière consiste à utiliser foreach pour exploiter toutes les données interrogées, puis à les enregistrer dans la base de données.
$users = User::all(); foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); }
Si les données sont très volumineuses, le système peut manquer de mémoire, et cette méthode est évidemment maladroite.
Laravel fournit une solution simple pour cela
La méthode chunk de Laravel peut diviser la collection en plusieurs petites collections de tailles spécifiées
User::chunk(100, function ($users) { foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); } });
Le principe de l'exécution du code ci-dessus est le suivant :
Exécutez un chunk, et ce chunk en découvrira 100 données utilisateur, mettez à jour chaque donnée utilisateur
Vérifiez ensuite 100 données utilisateur, puis effectuez l'opération de mise à jour, et ainsi de suite.
Cela signifie que lors de l'interrogation de données, vous n'obtiendrez pas une grande quantité de données de la base de données, 100 éléments de données sont interrogés à chaque fois, au lieu de la table entière.
Cela réduira la pression sur le système.
2. Choses à noter
Voici l'objet de cet article :
Mais attention, les résultats du filtre ne peuvent pas être exécutés comme ça
User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } });
En termes d'exécution de code, cette instruction ne provoquera aucune erreur
Mais ici Le problème est que vous souhaitez filtrer les utilisateurs avec approved=0, effectuer des opérations de base de données avec approved=1
, puis fragmenter les 100 éléments de données suivants, après quoi les données ont changé et vous manquerez une page de données.
Cela signifie que vous ne traiterez que la moitié des inscriptions et en laisserez la moitié de côté.
Solution :
Vous pouvez utiliser la méthode chunkById après Laravel 5.2
Vous pouvez vous référer au code suivant avant Laravel 5.2
while(User::where('approved', 0)->count() > 0) { User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } }); }
[Recommandations associées : tutoriel vidéo laravel]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!