Невозможно выяснить, как установить правильное ограничение onDelete для таблицы в 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
});
Я не получаю никаких ошибок. Кроме того, даже опция "каскад" не работает (только в таблице галереи). При удалении галереи удаляются все снимки. Но удаляя обложку, не удаляйте галерею (для целей тестирования).
Так как даже "каскад" не запускается, я "устанавливаю нуль" не является проблемой.
EDIT (обходной путь):
После прочтения этого article я немного изменил свою схему. Теперь таблица изображений содержит ячейку "is_cover", которая указывает, является ли это изображение обложкой на его альбоме или нет.
Решение исходной задачи по-прежнему высоко ценится!