Laravel Schema 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, которая указывает, является ли это изображение обложкой в ​​его альбоме или нет.

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


person M K    schedule 01.01.2014    source источник


Ответы (7)


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

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

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

$table->integer('foreign_id')->unsigned()->nullable();
person Johan    schedule 10.09.2014
comment
плюс за ->nullable() - person mohsenJsh; 16.02.2016
comment
Есть ли по этому поводу документация Laravel? - person Chuck Le Butt; 18.02.2019
comment
laravel.com/docs/6.x/migrations#foreign-key- ограничения не документируется, какие есть параметры, но я думаю, вы можете предположить, что это значения mysql по умолчанию (см. ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php) - person Dirk Jan; 23.03.2020

В laravel 8 вы можете использовать:

$table->foreignId('forign_id')->nullable()->constrained("table_name")->cascadeOnUpdate()->nullOnDelete();

Справочная информация

Различные параметры объявлены в классе Illuminate\Database\Schema\ForeignKeyDefinition (см. источник).

person Ayman Elshehawy    schedule 14.12.2020

  • Это известная проблема в Laravel. Подробнее об этом здесь.

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

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

person M K    schedule 02.01.2014
comment
@SimonBengtsson Вопрос должен быть закрыт или удален. - person M K; 28.08.2014

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

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

$ table-> onDelete ('set null') должен работать, возможно, попробуйте

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

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

person Chris Barrett    schedule 01.01.2014
comment
Возможно, вы захотите откатиться, написать sql вручную, а затем выполнить и запустить тесты на локальном компьютере. Все, что я могу найти, говорит о том, что должно работать dev. mysql.com/doc/refman/5.6/en/, может быть проблема с созданием sql - person Chris Barrett; 01.01.2014
comment
Спасибо! К сожалению, это привело к той же проблеме. Я думаю, что это что-то особенное для SqLite и циклических ссылок. - person M K; 01.01.2014
comment
Плюс один, потому что onDelete ('set null') работает с mysql. - person Simon Bengtsson; 01.07.2014

При использовании Laravel 4.2 в MySQL 5.5 с InnoDB работает onDelete ('set null').

person Mark Kendall    schedule 26.08.2014

в laravel 8 это можно сделать так.

 $table->foreignId('table_id')->nullable()->constrained()->onDelete('set null');

Модификаторы столбца nullable () должны вызываться перед constrained () и onDelete ('set null')

person Ali Akbar Afridi    schedule 19.03.2021

SQLite не поддерживает вариант ADD CONSTRAINT команды ALTER TABLE

иностранный SQLite ключ не устанавливает значение null при удалении в тесте phpunit

person AmirRezaM75    schedule 12.04.2021