我尝试使用Laravel的Eloquent创建一个数据库系统,它具有以下策略:
--项目
------阶段
- ---------土地
其中每个项目有多个阶段,每个阶段有多块土地,一块土地只能属于一个阶段,一个阶段只能属于一个项目。
我最初的计划是使lands
表引用stages
表,而该stage表将依次引用它的父“项目”。
这是可行的。但是,这种设置不合适,因为系统需要每个阶段,焊环ID需要从1开始。例如(项目1有第1阶段、第2阶段。每个阶段有自己的土地1、土地2等-项目2有 * 阶段1* -〉土地1、土地2等),但是前面的设置将使stages
和lands
的ID累积,而不是对每个父项目唯一。
"我想做的事"
我尝试按如下方式组合主键:
项目迁移:
Schema::create('projects', function (Blueprint $table) {
$table->id("project_id");
$table->string('name');
$table->string('region');
$table->double('area');
$table->date('start_date')->nullable();
$table->date('end_date')->nullable();
});
阶段迁移:
Schema::create('stages', function (Blueprint $table) {
// $table->id();
$table->unsignedBigInteger('stage_id');
$table->unsignedBigInteger('project_id');
$table->foreign('project_id')->references('project_id')->on('projects')->onDelete('cascade');
$table->primary(array('project_id', 'stage_id'), 'project_stage_id');
$table->string('name');
$table->double('area');
$table->date('start_date')->nullable();
$table->date('end_date')->nullable();
});
土地迁移:
$table->id();
$table->unsignedBigInteger('land_id');
$table->unsignedBigInteger('stage_id');
$table->unsignedBigInteger('project_id');
$table->foreign('stage_id')->references('stage_id')->on('stages')->onDelete('cascade');
$table->foreign('project_id')->references('project_id')->on('stages')->onDelete('cascade');
$table->primary(array('project_id', 'stage_id', 'land_id'), 'land_id');
$table->date('cultivation_date');
执行迁移后,我收到以下错误:
SQLSTATE[42830]: Invalid foreign key: 7 ERROR: there is no unique constraint matching given keys for referenced table "stages" (SQL: alter table "lands" add constraint "lands_stage_id_foreign" foreign key ("stage_id") references "stages" ("stage_id") on delete cascade)
我已经单独测试了阶段-项目关系,它按预期工作,但是,我无法将唯一的阶段-项目键集成到“lands”表中。
1条答案
按热度按时间nhhxz33t1#
一切正常!此错误是由迁移文件的日期顺序引起的。请确保在创建
lands
表之前先创建stages
表。例如: