Laravel 6: db: seed для нескольких посевов у пользователя - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть следующие фабрики и сеялки.

Заводы

  • 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 artisan db: seed

Итак, что здесь происходит? Я использую Laravel 6.4.1.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

В соответствии с вашим кодом для каждого потока создается один пользователь. Для каждого ответа создается один пользователь. Таким образом, для 50 потоков и 10 ответов в каждой теме, около 50x10=500 пользователей должны создавать. Кроме того, в своем классе пользователей вы создаете 50 пользователей, то есть, естественно, 550 пользователей.

Теперь, если вы хотите, чтобы ваши пользователи оставались на низком уровне, вместо создания нового пользователя для каждой цепочки / ответа, вы могли бы случайно выбрать пользователя из базы данных и назначить. Вот пример

ThreadFactory

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

ReplyFactory

    $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
        ];
    });

Чтобы это работало, вам сначала нужно заполнить пользовательскую таблицу любым количеством пользователей.

0 голосов
/ 01 ноября 2019

Это потому, что когда вы определяете фабрику потоков для каждого потока, он создает нового пользователя, который присоединяется к этому потоку. Что вам нужно сделать, это создать только один 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_id и thread_id для пользователя и потока, которые только что были созданы
...