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()