Неможливо зрозуміти, як правильно встановити обмеження 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 (вирішення):
Прочитавши цю статтю, я трохи змінив схему. Тепер таблиця фотографій містить клітинку "is_cover", яка вказує, чи ця картинка є обкладинкою у своєму альбомі чи ні.
Рішення оригінальної проблеми все ще високо оцінено!
->nullable()