>

안녕하세요. 마이그레이션에서 관계를 정의하려고합니다. 자식이있을 때 부모 레코드가 삭제되지 않도록 삭제 제한을 사용하고 있습니다. 그러나 작동하지 않습니다. 예를 들어 에디션 (자식)이있는이 이벤트 테이블 (부모)이 있습니다. 에디션 테이블에서 event_id를 사용하고 있습니다.   onDelete('restrict') 와 함께  내 에디션 테이블에 event_id가 있습니다. 긴 레코드에 에디션 테이블의 하위 레코드가 있으면 이벤트 테이블에서 삭제하는 것을 제한해야합니까? 하지만 그 ..

다음은 두 테이블의 마이그레이션입니다

이벤트 (부모)

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEventsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('events', function (Blueprint $table) {
            //master table
            $table->increments('event_id');
            $table->string('name');
            $table->text('full_name');
            $table->text('description');
            $table->tinyInteger('status');
            $table->integer('created_by');
            $table->integer('updated_by');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('events');
    }
}

버전 (자식)

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEditionsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('editions', function (Blueprint $table) {
            $table->increments('edition_id');
            $table->integer('event_id')->unsigned();
            $table->string('name');
            $table->dateTime('start')->nullable();
            $table->dateTime('end')->nullable();
            $table->enum('stage', ['Archived', 'Cancelled', 'Closed', 'Live', 'On-site', 'Pre-event', 'Sold out'])->nullable()->default('Pre-event');
            $table->tinyInteger('status');
            $table->integer('created_by');
            $table->integer('updated_by');
            $table->timestamps();
        });
        Schema::table('editions', function($table) {
            $table->foreign('event_id')
                ->references('event_id')->on('events')
                ->onDelete('restrict')->onUpdate('restrict');


        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('editions');
    }
}


  • 답변 # 1

    외래 키 정의에서 누락 된 것으로 보이는 것은 인덱스를 추가하는 것입니다. 외래 키의 요구 사항이며 문제를 일으키는 원인 일 수 있습니다.

    변경 시도

    $table->integer('event_id')->unsigned();
    
    

    to

    $table->integer('event_id')->unsigned()->index();
    
    

    또한 열 정의 바로 뒤에 외래 키 정의를 추가 할 수 있으며 다른 Schema::table() 에 넣을 필요가 없습니다.  이 스레드에 따라 :

    와이즈 비즈

    따라서

    If you are using the SoftDeletes trait, then calling the delete() method on your model will only update the deleted_at field in your database, and the onDelete constraint will not be triggered, given that it is triggered at the database level i.e. when a DELETE query is executed.

    를 사용하십시오   DELETE 가 아님  그렇지 않으면 제약 조건을 수동으로 추가 할 수 있습니다.

    SoftDeletes

관련 자료

  • 이전 asp.net mvc - 별개의 합계를 얻기 위해 두 개의 관련없는 엔터티에 대한 조인 설명
  • 다음 java - jdbc 오류 - 선택에 대해 executeupdate ()를 발행 할 수 없습니다