ไม่สามารถหาวิธีตั้งค่า 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" ซึ่งระบุว่ารูปภาพนี้เป็นปกในอัลบั้มหรือไม่
วิธีแก้ปัญหาเดิมยังคงได้รับการชื่นชมอย่างมาก!
->nullable()