Схема Laravel OnDelete имеет значение null


Не могу понять, как правильно установить ограничение 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
});

Я не получаю никаких ошибок. Кроме того, даже опция "каскад" не работает (только в таблице галереи). При удалении галереи удаляются все изображения. Но удаление изображения на обложке не приведет к удалению галерея (для целей тестирования).

Поскольку даже "каскад" не срабатывает, я "установил нуль" - это не проблема.

РЕДАКТИРОВАТЬ (обходной путь):

Прочитав эту статью , я немного изменил свою схему. Теперь таблица изображений содержит ячейку "is_cover", которая указывает, является ли эта фотография обложкой альбома или нет.

Решение исходной проблемы по-прежнему высоко ценится!

Author: Brian Tompsett - 汤莱恩, 2014-01-01

4 answers

Если вы хотите установить значение null при удалении:

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

Сначала убедитесь, что вы установили поле внешнего ключа как обнуляемое:

$table->integer('foreign_id')->unsigned()->nullable();
 203
Author: Johan, 2014-09-10 12:46:23

В соответствии с

Http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

$таблица->OnDelete('установить значение null') должно работать, предварительно попробуйте

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

Если есть какие-либо ошибки, также было бы полезно

 4
Author: Chris Barrett, 2014-01-01 13:32:25

Используя Laravel 4.2 в MySQL 5.5 с InnoDB, OnDelete ("установить значение null") работает.

 2
Author: Mark Kendall, 2014-08-26 10:25:28
  • Это известная проблема в Laravel. Более подробная информация об этом здесь.

  • Эта функция не поддерживается в SQLite, см. здесь

  • Также тема, в которой подробно описана эта проблема

 2
Author: M K, 2017-05-23 12:18:25