Não consigo descobrir como definir a restrição onDelete adequada em uma tabela no Laravel. (Estou trabalhando com SqLite)
$table->...->onDelete('cascade'); // works
$table->...->onDelete('null || set null'); // neither of them work
Tenho 3 migrações, criando a tabela da galeria:
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';
});
Criando a tabela de imagens:
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';
});
Vinculando a tabela da galeria a uma imagem:
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
});
Eu não recebo nenhum erro. Além disso, mesmo a opção "cascata" não funciona (apenas na mesa da galeria). Excluir uma galeria exclui todas as fotos. Mas excluir a imagem da capa não irá excluir a galeria (para fins de teste).
Visto que nem mesmo a "cascata" é acionada, "definir nulo" não é o problema.
EDITAR (solução alternativa):
Depois de ler este artigo , mudei um pouco meu esquema. Agora, a tabela de imagens contém uma célula "is_cover", que indica se a imagem é uma capa de seu álbum ou não.
Uma solução para o problema original ainda é muito apreciada!
->nullable()
../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php
)Este é um problema conhecido no Laravel. Mais informações sobre isso aqui .Este recurso não é compatível com SQLite, veja aqui
Também um tópico que mostra detalhadamente este problema
fonte
De acordo com
http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
$ table-> onDelete ('set null') deve funcionar antes de tentar
Se houver algum erro, também seria útil
fonte
Usando o Laravel 4.2 no MySQL 5.5 com InnoDB, onDelete ('set null') funciona.
fonte