首页 > 解决方案 > Laravel 数据库播种器,设置具体值 laravel 5

问题描述

我正在尝试填充我的数据库并拥有一个父status表和一个子server_statuses表。这是一对多的关系。

我遇到的问题是状态表只有 3 个值,需要将它们设置为特定值(success, warning, danger)。Larvaels 文档并没有深入探讨如何实现这一点。

我也不确定播种是否是我收到错误的原因,发布在下面。如果这不是我想的播种,我可以在 PHPmyAdmin 中手动输入 3 个值,然后运行我的 DB 播种器。我还将发布我的迁移以及播种器文件。

关于解决此错误的任何想法?

运行播种机时的当前错误:

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();
        });

播种机工厂(删除了我为 Status 尝试的内容,因为这是对解决方案的一次糟糕尝试):

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

标签: phpmysqldatabaselaravellaravel-seeding

解决方案


此错误是因为您将条目插入到server_statusesstatus_id中不存在的条目中status。首先使用 id 1 到 3 进行条目,status然后运行命令将数据插入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。如需更多信息,请访问此处


推荐阅读