laravel 雄辩三元复合主键

c86crjj0  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(108)

我尝试使用Laravel的Eloquent创建一个数据库系统,它具有以下策略:
--项目
------阶段

  • ---------土地
    其中每个项目有多个阶段,每个阶段有多块土地,一块土地只能属于一个阶段,一个阶段只能属于一个项目。
    我最初的计划是使lands表引用stages表,而该stage表将依次引用它的父“项目”。
    这是可行的。但是,这种设置不合适,因为系统需要每个阶段,焊环ID需要从1开始。例如(项目1有第1阶段、第2阶段。每个阶段有自己的土地1、土地2等-项目2有 * 阶段1* -〉土地1、土地2等),但是前面的设置将使stageslands的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”表中。

nhhxz33t

nhhxz33t1#

一切正常!此错误是由迁移文件的日期顺序引起的。请确保在创建lands表之前先创建stages表。例如:

2023_02_13_034631_create_stages_table
// AND
2023_02_14_034631_create_lands_table

相关问题