Схема Laravel onDelete встановлюється null


112

Неможливо зрозуміти, як правильно встановити обмеження 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", яка вказує, чи ця картинка є обкладинкою у своєму альбомі чи ні.

Рішення оригінальної проблеми все ще високо оцінено!

Відповіді:


317

Якщо ви хочете встановити null при видаленні:

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

Спочатку переконайтеся, що ви встановили поле зовнішнього ключа як нульове:

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

37
плюс за->nullable()
mohsenJsh

3
Чи є якась документація Laravel o це?
Чак Ле

laravel.com/docs/6.x/migrations#foreign-key-constraints він не документує, які варіанти існують, але я думаю, ви можете припустити, що це значення mysql за замовчуванням (див. ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Дірк

6
  • Це відоме питання в Laravel. Більше інформації про це тут .

  • Ця функція не підтримується в SQLite, дивіться тут

  • Також тема , яка детально демонструє цю проблему


1
@SimonBengtsson Проблема повинна бути закрита або видалена.
МК

5

Згідно з

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

$ table-> onDelete ('set null') має працювати попередньо спробувати

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

Якщо є якісь помилки, також буде корисно


Можливо, ви захочете відкотитись, виписати sql вручну, а потім виконати і виконати тести на локальному рівні. Все, що я можу знайти, говорить, що це повинно працювати dev.mysql.com/doc/refman/5.6/en/… , може бути проблемою, що породжує sql
Кріс Барретт

Дякую! На жаль, це спричинило те саме питання. Я думаю, що це щось специфічне для SqLite та кругових посилань.
МК

Плюс один, тому що onDelete ('set null') працює з mysql.
Саймон Бенгтссон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.