라 라벨 스키마 onDelete set null


112

Laravel의 테이블에 적절한 onDelete 제약 조건을 설정하는 방법을 알 수 없습니다. (저는 SqLite와 함께 일하고 있습니다)

$table->...->onDelete('cascade'); // works
$table->...->onDelete('null || set null'); // neither of them work

갤러리 테이블을 만드는 세 가지 마이그레이션이 있습니다.

Schema::create('galleries', function($table)
{
    $table->increments('id');
    $table->string('name')->unique();
    $table->text('path')->unique();
    $table->text('description')->nullable();
    $table->timestamps();
    $table->engine = 'InnoDB';
});

그림 테이블 만들기 :

Schema::create('pictures', function($table)
{
    $table->increments('id');
    $table->text('path');
    $table->string('title')->nullable();
    $table->text('description')->nullable();
    $table->integer('gallery_id')->unsigned();
    $table->foreign('gallery_id')
        ->references('id')->on('galleries')
        ->onDelete('cascade');
    $table->timestamps();
    $table->engine = 'InnoDB';
});

갤러리 테이블을 그림에 연결 :

Schema::table('galleries', function($table)
{
    // id of a picture that is used as cover for a gallery
    $table->integer('picture_id')->after('description')
        ->unsigned()->nullable();
    $table->foreign('picture_id')
        ->references('id')->on('pictures')
        ->onDelete('cascade || set null || null'); // neither of them works
});

오류가 발생하지 않습니다. 또한 "계단식"옵션도 작동하지 않습니다 (갤러리 테이블에서만). 갤러리를 삭제하면 모든 사진이 삭제됩니다. 그러나 표지 사진을 삭제해도 갤러리는 삭제되지 않습니다 (테스트 목적).

"캐스케이드"조차 트리거되지 않기 때문에 "null 설정"은 문제가되지 않습니다.

편집 (해결 방법) :

기사를 읽은 후 스키마를 약간 변경했습니다. 이제 pictures 테이블에는이 사진이 앨범의 표지인지 여부를 나타내는 "is_cover"셀이 있습니다.

원래 문제에 대한 해결책은 여전히 ​​높이 평가됩니다!

답변:


317

삭제시 null을 설정하려는 경우 :

$table->...->onDelete('set null');

먼저 외래 키 필드를 nullable로 설정했는지 확인하십시오.

$table->integer('foreign_id')->unsigned()->nullable();

37
플러스->nullable()
mohsenJsh

3
이것에 Laravel 문서가 있습니까?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints 어떤 옵션이 있는지 문서화하지 않지만 기본 mysql 값이라고 가정 할 수 있다고 생각합니다 (참조 ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk 1

6
  • 이것은 Laravel의 알려진 문제입니다. 여기 에 대한 자세한 정보 .

  • 이 기능은 SQLite에서 지원되지 않습니다. 여기를 참조 하십시오.

  • 또한 이 문제에 대한 자세한 설명이 있는 주제


1
@SimonBengtsson 문제가 종결되었거나 삭제되었을 것입니다.
MK

5

에 따르면

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

$ table-> onDelete ( 'set null') 작동해야합니다.

$table->...->onDelete(DB::raw('set null'));

오류가 있으면 도움이 될 것입니다.


롤백하고 SQL을 직접 작성한 다음 로컬에서 테스트를 실행하고 실행할 수 있습니다. 내가 찾을 수있는 모든 것은 작동해야한다고 말한다 dev.mysql.com/doc/refman/5.6/en/… , SQL을 생성하는 데 문제가 될 수 있습니다
Chris Barrett

감사! 불행히도 같은 문제가 발생했습니다. SqLite 및 순환 참조에만 해당되는 것 같습니다.
MK

onDelete ( 'set null')이 mysql과 함께 작동하기 때문에 플러스 하나.
Simon Bengtsson

3

InnoDB와 함께 MySQL 5.5에서 Laravel 4.2를 사용하면 onDelete ( 'set null')가 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.