Nie mogę dowiedzieć się, jak ustawić odpowiednie ograniczenie onDelete dla tabeli w Laravel. (Pracuję z SqLite)
$table->...->onDelete('cascade'); // works
$table->...->onDelete('null || set null'); // neither of them work
Mam 3 migracje, tworząc tabelę galerii:
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';
});
Tworzenie tabeli zdjęć:
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';
});
Łączenie tabeli galerii ze zdjęciem:
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
});
Nie otrzymuję żadnych błędów. Ponadto nawet opcja „kaskada” nie działa (tylko w tabeli galerii). Usunięcie galerii powoduje usunięcie wszystkich zdjęć. Ale usunięcie zdjęcia na okładkę nie spowoduje usunięcia galerii (do celów testowych).
Ponieważ nawet „kaskada” nie jest wyzwalana, „ustawiam wartość null” nie stanowi problemu.
EDYTUJ (obejście):
Po przeczytaniu tego artykułu zmieniłem nieco schemat. Teraz tabela obrazów zawiera komórkę „is_cover”, która wskazuje, czy to zdjęcie jest okładką albumu, czy nie.
Rozwiązanie pierwotnego problemu jest nadal wysoko cenione!
->nullable()
../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php
)Jest to znany problem w Laravel. Więcej informacji na ten temat tutaj .Ta funkcja nie jest obsługiwana w SQLite, zobacz tutaj
Również temat, który zawiera szczegółowe omówienie tego problemu
źródło
Według
http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
$ table-> onDelete ('set null') powinno działać, być może spróbuj
Jeśli są jakieś błędy, również byłoby pomocne
źródło
Używając Laravel 4.2 na MySQL 5.5 z InnoDB, działa onDelete ('set null').
źródło