Laravel Schema onDelete set null


112

Không thể tìm ra cách đặt ràng buộc onDelete thích hợp trên một bảng trong Laravel. (Tôi đang làm việc với SqLite)

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

Tôi có 3 lần di chuyển, tạo bảng thư viện:

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';
});

Tạo bảng ảnh:

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';
});

Liên kết bảng thư viện với một hình ảnh:

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
});

Tôi không nhận bất kỳ lỗi nào. Ngoài ra, ngay cả tùy chọn "thác nước" cũng không hoạt động (chỉ trên bàn thư viện). Xóa thư viện sẽ xóa tất cả ảnh. Nhưng xóa ảnh bìa, sẽ không xóa thư viện (với mục đích thử nghiệm).

Vì ngay cả "thác" không được kích hoạt, tôi "đặt null" không phải là vấn đề.

CHỈNH SỬA (giải pháp thay thế):

Sau khi đọc bài viết này, tôi đã thay đổi lược đồ của mình một chút. Bây giờ, bảng ảnh chứa ô "is_cover", cho biết ảnh này có phải là ảnh bìa trong album của nó hay không.

Một giải pháp cho vấn đề ban đầu vẫn được đánh giá cao!

Câu trả lời:


317

Nếu bạn muốn đặt null khi xóa:

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

Trước tiên, hãy đảm bảo rằng bạn đã đặt trường khóa ngoại là nullable:

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

37
cộng cho->nullable()
mohsenJsh

3
Có một số tài liệu Laravel o này không?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints nó không ghi lại những tùy chọn nào có, nhưng tôi nghĩ bạn có thể cho rằng đó là các giá trị mysql mặc định (xem ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk Ngày

6
  • Đây là một vấn đề đã biết trong Laravel. Thông tin thêm về điều này ở đây .

  • Tính năng này không được hỗ trợ trong SQLite, xem tại đây

  • Cũng là một chủ đề có trình bày chi tiết về vấn đề này


1
@SimonBengtsson Vấn đề phải được đóng hoặc bị xóa.
MK

5

Dựa theo

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

$ table-> onDelete ('set null') nên hoạt động trước khi thử

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

Nếu có bất kỳ lỗi nào, cũng sẽ hữu ích


Bạn có thể muốn quay trở lại, viết sql bằng tay, sau đó khám phá và chạy thử nghiệm trên cục bộ. Tất cả những gì tôi có thể tìm thấy nói rằng nên làm việc dev.mysql.com/doc/refman/5.6/en/... , có thể là một vấn đề tạo ra sql
Chris Barrett

Cảm ơn! Thật không may, nó dẫn đến cùng một vấn đề. Tôi nghĩ rằng đó là một cái gì đó cụ thể cho SqLite và các tham chiếu vòng tròn.
MK

Thêm một vì onDelete ('set null') hoạt động với mysql.
Simon Bengtsson,

3

Sử dụng Laravel 4.2 trên MySQL 5.5 với InnoDB, onDelete ('set null') hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.