Как создать модель, которая имеет отношение к самой себе

#php #laravel #laravel-8 #laravel-seeding

#php #laravel #laravel-8 #laravel-заполнение

Вопрос:

Я использую Laravel 8 и PHP версии 7.4. У меня есть модель со схемой, сгенерированной с помощью приведенной ниже миграции.

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 может быть много contests . Для этого я сгенерировал фабричный класс.

ContestFactory

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

ContestSeeder

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

Приведенное выше выдает следующую ошибку.

ErrorException array_rand(): массив пуст

Как я могу решить эту проблему?

Комментарии:

1. на тот момент они еще не были созданы … вы можете вызвать create()->each(...) итерацию по ним после того, как все они будут созданы

2. Спасибо @lagbox, если бы это был ответ, я бы принял его. create()->each(...) это то, что мне было нужно

Ответ №1:

Записи еще не были созданы, когда вы выполняете запрос для извлечения информации. Вы можете вызывать create() без аргументов, чтобы он создавал записи, после чего вы можете повторять возвращенную коллекцию:

 AppModelsContest::factory(10)->create()->each(...);