Laravel Модель высева на фабрике со столбцом, связанным со столбцом в той же таблице - PullRequest
0 голосов
/ 02 мая 2019

Я загружаю некоторые поддельные данные в laravel. У меня есть таблица

Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('parent_id')->default(0);
        $table->string('name');
        $table->integer('depth');
        $table->timestamps();
 });

parent_id должен содержать данные category.id

Мне интересно, это лучший способ сделать это?

CategoriesTableSeeder

factory(App\Category::class, 10)->make()->each(
        function ($c) {
            $c->fill(
                [
                    'parent_id' => App\Category::count() ? App\Category::pluck('id')->random() : 0
                ]
            )->save();
        }
);

CategoryFactory

$factory->define(Category::class, function (Faker $faker) {
    return [
        //'parent_id' => Category::pluck('id')->random(),
        'name' => ucfirst($faker->word),
        'depth' => 0,
    ];
});

Может быть, кто-то может написать лучшее решение для того же результата?Я много пробовал, этот работает, но я думаю, что код должен выглядеть более профессионально, чем сейчас.

1 Ответ

1 голос
/ 03 мая 2019

2019_05_03 _ ****** _ create_categories_table.php

Schema::create('categories', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedInteger('parent_id')->default(0);
    $table->string('name')->nullable();
    $table->integer('depth')->default(0);
    $table->timestamps();
});

CategoryFactory.php

$factory->define(Category::class, function (Faker $faker) {
    return [
        'parent_id' => Category::count() ? Category::pluck('id')->random() : 0,
        'name' => ucfirst($faker->word),
    ];
});

CategoriesTableSeeder.php

public function run()
{
    factory(Category::class, rand(1, 10))->create()->each(
        function ($category) {
            factory(Category::class, rand(1, 5))->create(['parent_id' => $category->id]);
        }
    );
}
...