php - 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)
];
});
解决方案
此错误是因为您将条目插入到server_statuses
表status_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
。如需更多信息,请访问此处。
推荐阅读
- xslt - 我怎样才能使这段代码更有条理或更容易看到,这里的 if 语句不是很好
- reactjs - onClick 事件仅在 chrome 78 中双击时触发
- logging - 作业超过最大日志长度,已终止
- url - 如何使用 Firebase/Google 云功能接收 Apple 的订阅状态 url 通知?
- c# - 将类成员作为函数参数传递
- symfony - 更改模式格式后,我网站的某些 url 得到随机 403
- android - 将图像添加到默认的 android 应用操作栏
- asp.net-mvc-4 - MVC4 Razor 在单个视图上访问多个模型类在各种元素上给出错误
- django - 在有和没有时区的 Django 中处理多个数据库
- html - 跨元素的舍入固定表格布局单元格宽度百分比计算