【问题标题】:Laravel 6: db:seed multiple seeding in userLaravel 6:db:在用户中播种多个种子
【发布时间】:2020-02-27 11:38:15
【问题描述】:

我有以下工厂和播种机。

工厂

  • UserFactory.php
  • ThreadFactory.php
  • ReplyFactory.php

播种者

  • UsersTableSeeder.php
  • ThreadTableSeeder.php
  • RepliesTableSeeder.php

UserFactory.php


    $factory->define(App\User::class, function (Faker $faker) {
        return [
            'name' => $faker->name,
            'email' => $faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    });

ThreadFactory.php


    $factory->define(App\Thread::class, function (Faker $faker) {
        return [
            'user_id' => function() {
                return factory(App\User::class)->create()->id;
            },
            'title' => $faker->sentence,
            'body'  => $faker->paragraph
        ];
    });

ReplyFactory.php


    $factory->define(App\Reply::class, function (Faker $faker) {
        return [

            'user_id' => function() {
                return factory(App\User::class)->create()->id;
            },

            'thread_id' => function() {
                return factory(App\Thread::class)->create()->id;
            },

            'body' => $faker->paragraph
        ];
    });

UsersTableSeeder.php


    public function run()
        {
            factory(App\User::class, 50)->create();
        }

ThreadTableSeeder.php


    public function run()
        {
            factory(App\Thread::class, 50)->create()->each(function ($thread) {
                factory(App\Reply::class, 10)->create(['thread_id' => $thread->id]);
            });
        }

RepliesTableSeeder.php


    public function run()
        {
         // nothing in here . . .   
        }

DatabaseSeeder.php


    public function run()
        {
            $this->call(ThreadTableSeeder::class);
        }

我的问题是运行以下命令时,我在用户表中有 550 个用户行,但其他两个表是正确的。

php 工匠数据库:种子

那么,这里发生了什么?我正在使用 Laravel 6.4.1。

【问题讨论】:

    标签: database laravel factory seed


    【解决方案1】:

    根据每个线程的代码,创建一个用户。对于每个回复,都会创建一个用户。因此,对于每个线程中的 50 个线程和 10 个回复,用户应该创建大约 50x10=500。同样在您的用户播种器类中,您正在创建 50 个用户,这自然是 550 个用户的总和。

    现在,如果您想保持低用户数,而不是为每个线程/回复创建一个新用户,您可以从数据库中随机获取用户并分配。这是一个例子

    线程工厂

        $factory->define(App\Thread::class, function (Faker $faker) {
            return [
                'user_id' => \App\User::all()->random()->id,
                'title' => $faker->sentence,
                'body'  => $faker->paragraph
            ];
        });
    

    回复工厂

        $factory->define(App\Reply::class, function (Faker $faker) {
            return [
    
                'user_id' => \App\User::all()->random()->id,
    
                'thread_id' => function() {
                    return factory(App\Thread::class)->create()->id;
                },
    
                'body' => $faker->paragraph
            ];
        });
    

    要使其正常工作,您必须首先使用您想要的任意数量的用户播种用户表。

    【讨论】:

      【解决方案2】:

      这是因为当您为每个线程定义线程工厂时,它会创建一个附加到该线程的新用户。你应该做的是只创建一个 Seeder 来创建用户,并为每个用户创建线程和回复

      public function run()
      {
          factory(App\User::class, 50)->create()->each(function($user) {
              factory(App\Thread::class, 50)->create(['user_id' => $user->id])
                  ->each(function($thread) use ($user){
                      factory(App\Reply::class, 10)->create([
                          'user_id' => $user->id, 
                          'thread_id' => $thread->id
                      ]);
                  });
              });
          });
      }
      
      • 从创建 50 个用户开始
      • 为每个用户创建 50 个线程并将 user_id 键设置为等于创建的用户
      • 比为每个线程创建 10 个回复并将 user_idthread_id 设置为刚刚创建的用户和线程

      【讨论】:

        猜你喜欢
        • 2013-12-01
        • 2018-09-06
        • 2018-04-19
        • 2020-11-05
        • 1970-01-01
        • 2016-06-05
        • 2016-04-16
        • 1970-01-01
        • 2017-09-09
        相关资源
        最近更新 更多