Laravel Schema onDelete set 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 " не является проблемой.

редактировать (обходной путь):

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

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

4 72

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') должен работать prehaps try

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

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

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

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

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

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