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
});

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

так как даже "каскад" не запускается, я "установить null" не является проблемой.

EDIT (обходной путь):

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

решение первоначальной проблемы все еще сильно ценю!

4 ответов


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

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

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

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

по данным

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

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

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

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


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


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

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

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