Tornar a coluna não anulável em uma migração do Laravel

126

Estou escrevendo uma migração para criar determinadas colunas em uma tabela nullableagora. Para a função down, é claro que quero criar essas colunas not nullablenovamente. Eu olhei através do esquema construtor docs , mas não podia ver uma maneira de fazer isso.

Qualquer ajuda seria apreciada.

bilalq
fonte
a resposta mais completa para esta pergunta pode ser encontrada aqui: stackoverflow.com/a/32568625/4908847
szaman

Respostas:

227

Antes do Laravel 5, não havia uma maneira nativa do Laravel de alterar uma coluna de tabela existente usando o construtor de esquema. Você precisaria usar consultas brutas para isso.

No entanto, a partir do Laravel 5, você pode usar:

$table->...->nullable(false)->change();
TLGreg
fonte
1
Foi o que eu encontrei também. Um bom toque para o construtor de esquema permitir alterar as definições de coluna, às quais ele não parece suportar. Tenho certeza que existem muitos outros, como eu, que estão usando o construtor de esquema para modificar um banco de dados existente, não apenas criando tabelas do zero.
Sean the Bean
3
Taylor Otwell (criador do Laravel) disse há 6 dias (09/05/2014): "Ainda mantenho minha afirmação de que se alguém puder fazer isso com êxito e de forma limpa, eu a fundirei." github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan
3
@Musa Aparentemente, você pode definir um anulável coluna (ex: $table->string('colmn', 255)->nullable()->change();) mas o inverso não parece trabalho ( $table->string('colmn', 255)->change();), assim você ainda precisará usar consultas db matérias para este
Luís Cruz
5
Veja a resposta de @ MattMcDonald abaixo. Você pode usar nullable () para torná-lo nulo e nullable (false) para torná-lo Não anulável em uma migração.
Ajon
5
nullable(false)não funciona para mim no Laravel 5.3 :(
Stalinko 24/03
38

A partir do Laravel 5, é possível reverter isso nativamente - basta passar false como argumento para nullable ().

por exemplo

$table -> string('foo') -> nullable(false) -> change();
Matt McDonald
fonte
Funciona! Portanto, essa se tornou a resposta correta devido a atualizações no Laravel.
jlbang
Obrigado, embora eu não entenda por que as colunas não são anuláveis ​​por padrão. Geralmente, é uma prática recomendada e isso adiciona muito ruído ao código.
Morgan
1
As colunas são não nulas por padrão. O pôster estava apenas perguntando como reverter uma coluna já nula.
Matt McDonald
2

Primeiro, execute isso:

composer require doctrine/dbal

Em seguida, crie uma migração que altere a tabela da seguinte maneira:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}
funerr
fonte
4
Existe um motivo para descartar a coluna inteira na rotina de reversão? O método down () deve apenas desfazer a lógica do método up () para suportar migrações contínuas para trás e para frente.
Andrew
1

Você pode simplesmente declarar a coluna novamente sem -> anulável () e usar -> alterar

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
Gabriel Fernandez
fonte