[php] 라 라벨 스키마 onDelete set null

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”셀이 있습니다.

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



답변

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

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

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

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


답변

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

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

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


답변

에 따르면

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

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

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

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


답변

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


답변