Search code examples
phplaravellaravel-8laravel-seeding

How to seed a model that has a relationship to itself


I am using Laravel 8 and PHP v7.4 I have a model with a schema generated with the below migration.

CreateContestsTable

public function up()
{
    Schema::create('contests', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->foreignId('contest_id')->nullable();
        $table->foreign('contest_id')->references('id')->on('contests');
    });
}

A contest can have many contests. To seed this, I have generated a factory class.

ContestFactory

public function definition()
{
    return [
        'name' => $this->faker->paragraph(),
    ];
}

ContestSeeder

public function run()
{
    \App\Models\Contest::factory(10)->create([
        'contest_id' => array_rand(\App\Models\Contest::all()->pluck('id')->toArray())
    ]);
}

The above throws the following error.

ErrorException array_rand(): Array is empty

How can I solve this problem?


Solution

  • The records have not been created yet when you do the query to pluck the information. You can call create() with no arguments so it creates the records then you can iterate the returned Collection:

    \App\Models\Contest::factory(10)->create()->each(...);