Laravel Schema onDelete set null


112

Laravel'de bir tabloda uygun onDelete kısıtlamasının nasıl ayarlanacağını çözemiyorum. (SqLite ile çalışıyorum)

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

Galeri tablosunu oluştururken 3 taşımam var:

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

Resimler tablosunun oluşturulması:

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

Galeri tablosunu bir resme bağlamak:

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

Herhangi bir hata almıyorum. Ayrıca, "basamaklı" seçeneği bile çalışmaz (yalnızca galeri tablosunda). Bir galerinin silinmesi tüm resimleri siler. Ancak kapak resmini silmek galeriyi silmeyecektir (test amaçlı).

"Basamaklama" bile tetiklenmediğinden, sorun "null ayarladım" değil.

DÜZENLE (geçici çözüm):

Bu makaleyi okuduktan sonra şemamı biraz değiştirdim. Şimdi, resimler tablosu, bu resmin albümünde bir kapak olup olmadığını gösteren bir "is_cover" hücresi içerir.

Orijinal soruna bir çözüm hala çok takdir edilmektedir!

Yanıtlar:


318

Silme sırasında null ayarlamak istiyorsanız:

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

Öncelikle yabancı anahtar alanını null yapılabilir olarak ayarladığınızdan emin olun:

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

37
plus for->nullable()
mohsenJsh

3
Bunun için bazı Laravel belgeleri var mı?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints , hangi seçeneklerin olduğunu belgelemiyor, ancak bunun varsayılan mysql değerleri olduğunu varsayabileceğinizi düşünüyorum (bkz. ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk Jan

6
  • Bu Laravel'de bilinen bir sorundur. Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

  • Bu özellik SQLite'de desteklenmez, buraya bakın

  • Ayrıca bu sorunun ayrıntılı bir açıklamasını içeren bir konu


1
@SimonBengtsson Sorun kapatılmış veya silinmiş olmalı.
MK

5

Göre

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

$ table-> onDelete ('set null') çalışmalı belki deneyin

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

Herhangi bir hata varsa, ayrıca yardımcı olur


Geri almak, sql'yi elle yazmak ve ardından yerelde test etmek ve çalıştırmak isteyebilirsiniz. Bulabildiğim her şey , dev.mysql.com/doc/refman/5.6/en/… çalışması gerektiğini söylüyor, sql'yi oluşturan bir sorun olabilir
Chris Barrett

Teşekkürler! Maalesef aynı sorunla sonuçlandı. SqLite ve döngüsel referanslara özgü bir şey olduğunu düşünüyorum.
MK

Artı bir çünkü onDelete ('set null') mysql ile çalışır.
Simon Bengtsson

3

InnoDB ile MySQL 5.5 üzerinde Laravel 4.2 kullanıldığında, onDelete ('set null') çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.