Сеялка базы данных Laravel, настройка конкретных значений laravel 5 - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь заполнить свои базы данных, и у меня есть родительская таблица status и дочерняя таблица server_statuses. Это отношения один ко многим.

Проблема, с которой я сталкиваюсь, состоит в том, что таблица состояний имеет только 3 значения, и им необходимо установить конкретные значения (success, warning, danger). Документация Larvaels не дает глубоких сведений о том, как этого добиться.

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

Есть мысли по поводу решения этой ошибки?

Текущая ошибка при работе сеялки:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constrai
ENCES `statuses` (`id`)) (SQL: insert into `server_statuses` (`server_id`, `status_id`, `updated_at`, `created_at`) values (20, 4, 2018-07-03 12:21:05,

Миграции:

 Schema::create('statuses', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('key');
            $table->string('status');
            $table->timestamps();
        });

 Schema::create('server_statuses', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->integer('server_id')->unsigned();
            $table->foreign('server_id')->references('id')->on('servers')->onDelete('cascade');
            $table->integer('status_id')->unsigned();
            $table->foreign('status_id')->references('id')->on('statuses');
            $table->timestamps();
        });

Фабрика сеялок (deletd, что я пытался для статуса, потому что это была ужасная попытка решения):

$factory->define(Status::class, function (Faker $faker) {

    return [
        'key' => ,
        'status' => 
    ];
});

$factory->define(ServerStatus::class, function (Faker $faker) {
    return [
        'server_id' => $faker->numberBetween($min = 1, $max = 20),
        'status_id' => $faker->numberBetween($min = 1, $max = 3)
    ];
});

1 Ответ

0 голосов
/ 03 июля 2018

Эта ошибка вызвана тем, что вы вставляете записи в server_statuses с status_id, которых нет в таблице status. Сначала введите записи в status с идентификаторами от 1 до 3, а затем выполните команду для вставки данных в server_statuses.

На основании вашего последнего комментария. Способ заполнения базы данных из массива.

Создать класс сеялки:

use Illuminate\Database\Seeder;
use App\Models\Status;

class StatusSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run() {
        DB::table('status')->delete();
        $statuses = [
            ['key' => 1, 'status' => '1'],
            ['key' => 2, 'status' => '2'],
        ];
        foreach ($statuses as $status) {
            Status::create(array(
                'key' => $status["key"],
                'status' => $status["status"],
            ));
        }
    }

}

И добавить свою запись по умолчанию DatabaseSeeder.php

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

Запустить процесс посева по php artisan db:seed. Для получения дополнительной информации посетите здесь .

...