Maison >cadre php >Laravel >Explication détaillée de la façon dont Laravel Seeder génère des millions de données de simulation

Explication détaillée de la façon dont Laravel Seeder génère des millions de données de simulation

藏色散人
藏色散人avant
2021-03-26 17:01:102874parcourir

Laravel intègre la bibliothèque Faker et fournit Seeder pour nous aider à générer facilement des données de simulation.

Écrivez d'abord l'entrepôt de données et le code de remplissage des données

Explication détaillée de la façon dont Laravel Seeder génère des millions de données de simulationCode de l'entrepôt de données

use App\Models\Topic;use Faker\Generator as Faker;$factory->define(Topic::class, function (Faker $faker) {

    $sentence = $faker->sentence();

    // 随机取一个月以内的时间
    $updated_at = $faker->dateTimeThisMonth();

    // 传参为生成最大时间不超过,因为创建时间永远比更改时间要早
    $created_at = $faker->dateTimeThisMonth($updated_at);

    return [
        'title' => $sentence,
        'body' => $faker->text(),
        'excerpt' => $sentence,
        'created_at' => $created_at,
        'updated_at' => $updated_at,
    ];});

Code de remplissage des données

 class TopicsTableSeeder extends Seeder{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 所有用户ID数组,如:[1,2,3,4]
        $user_ids = User::all()->pluck('id')->toArray();

        // 所有分类 ID 数组,如:[1,2,3,4]
        $category_ids = Category::all()->pluck('id')->toArray();

        // 获取 Faker 实例
        $faker = app(Faker\Generator::class);

        $topics = factory(Topic::class)
            ->times(1000)
            ->make()
            ->each(function ($topic, $index) use ($user_ids, $category_ids, $faker){
                // 从用户 ID 数组中随机取出一个并赋值
                $topic->user_id = $faker->randomElement($user_ids);

                // 话题分类,同上
                $topic->category_id = $faker->randomElement($category_ids);
            });

        // 将数据集合转换为数组,并插入到数据库中
        Topic::insert($topics->toArray());
    }}

Nous définissons le remplissage par times() Nombre plusieurs fois, exécutez la commande de remplissage de données pour remplir 1 000 éléments de données dans le tableau des sujets, ce qui est très pratique.

php artisan db:seed --class=TopicsTableSeeder

Si nous voulons insérer 1 million de données, pouvons-nous simplement changer les paramètres de times() à 1 000 000 ? Lorsque vous faites cela, vous trouverez l'erreur suivante

General error: 1390 Prepared statement contains too many placeholders

Ce problème est dû au fait que MySQL prend en charge jusqu'à 65 535 (2 ^ 16-1) espaces réservés par défaut et que les données écrites sont constituées de m colonnes et de n lignes. m*n doit être inférieur à 65535.

Il est donc impossible d'insérer une grande quantité de données à la fois. Après vérification

, il n'y a aucun paramètre pertinent pour le nombre d'exécutions.

Finalement, j'ai décidé d'utiliser un script shell pour le résoudre.

for (( i = 0; i < 1000; i++ )); do
    /usr/local/bin/php artisan db:seed --class=TopicsTableSeederdone
Attendez un instant et vous constaterez qu'1 million de données ont été générées !

php artisan db:seedPS : L'entrepôt de données et le code de remplissage des données proviennent de larabbs

Recommandé :

Les cinq derniers didacticiels 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer