Laravel Schema onDelete set null


112

ไม่สามารถหาวิธีตั้งค่า onDelete constraint ที่เหมาะสมบนโต๊ะใน Laravel ได้ (ฉันทำงานกับ SqLite)

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

ฉันมีการย้ายข้อมูล 3 รายการโดยสร้างตารางแกลเลอรี:

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" จึงไม่ใช่ปัญหา

แก้ไข (วิธีแก้ปัญหาชั่วคราว):

หลังจากอ่านบทความนี้ฉันได้เปลี่ยนสคีมาเล็กน้อย ตอนนี้ตารางรูปภาพมีเซลล์ "is_cover" ซึ่งระบุว่ารูปภาพนี้เป็นปกในอัลบั้มหรือไม่

วิธีแก้ปัญหาเดิมยังคงได้รับการชื่นชมอย่างมาก!

คำตอบ:


319

หากคุณต้องการตั้งค่า null เมื่อลบ:

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

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณตั้งค่าฟิลด์คีย์นอกเป็น nullable:

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

37
plus สำหรับ->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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.