Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Quero registrar timestamps, mas não consigo

Cheguei até o ponto da aula onde o professor explica:

"Nesse ponto, se atualizarmos a página do nosso formulário, receberemos um erro. Isso porque o Laravel tentará inserir, na tabela series, os campos nome, updated_at e created_at, mas não definimos esses campos! Por padrão, o Laravel adiciona esses campos para informar quando foi a última vez que o registro foi atualizado e quando ele foi criado. Se quiséssemos adicionar esses campos nas nossas tabelas para que o Laravel os controle automaticamente, poderíamos criar um $table->timestamps() na função up() da nossa migration. E é só rodar essa migration de novo e nosso problema tá resolvido. "

O professor optou por não utilizar esta informação, mas eu como teste e forma de aprendizado quis tentar utilizar e não consegui. Primeiro erro foi:

$ php artisan migrate
Nothing to migrate.

Depois lendo o fórum ele comentou "Basta criar uma nova migration para atualizar a tabela, Luis." e eu fiz assim e deu erro:

$ php artisan make:migration
  Not enough arguments (missing: "name").

Depois reproduzi o que o professor falou também e deu erro novamente:

$ php artisan make:migration --table=series
  Not enough arguments (missing: "name").

Não estou conseguindo usar o "timestamps" e nem rodar novamente o migration. Podem me ajudar?

3 respostas

Olá Amanda,

O primeiro comando php artisan migrate deu esse retorno porque você já deve ter executado as migrations antes, assim ele não encontra nenhuma migration nova para executar, mesmo que você tenha editado uma existente.

Por isso que ele recomenda criar uma nova migration com o segundo comando, o make:migration, o que faltou foi informar o nome que você quer dar à essa nova migration, por isso a mensagem de erro. O correto seria algo tipo:

php artisan make:migration add_timestamps_to_series --table=series

Então para adicionar os timestamps você pode continuar pelo primeiro caminho que você seguiu, editando a sua migration já existente, com a diferença de que para executá-la você vai ter que apagar os dados atuais do banco. Após editar a migration para adicionar o $table->timestamps(); você pode executar o migrate novamente com o fresh como mostrado abaixo:

Cuidado! esse comando vai apagar o conteúdo atual do banco antes de executar todas as migrations

php artisan migrate:fresh

Isso é muito útil para resetar o banco e reexecutar todas as migrations. Caso você não queira apagar o conteúdo do banco me avisa que eu posso mostrar como fazer pelo segundo caminho, com uma nova migration e sem apagar os dados do banco.

Espero ter ajudado, qualquer coisa é só falar!

Ei, Lucas! Tudo bem?

Fiz os passos que você disse primeiro. Coloquei o comando:

$ php artisan make:migration add_timestamps_to_series --table=series
Created Migration: 2020_10_23_134013_add_timestamps_to_series

Aí na nova migration coloquei o "$table->timestamps();" no "up()". Daí executei:

$ php artisan migrate
Migrating: 2020_10_23_134013_add_timestamps_to_series
Migrated:  2020_10_23_134013_add_timestamps_to_series

E quando fiz php artisan serve para testar, funcionou mesmo.

MAS aí realmente eu preferiria adicionar os timestamps editando a migration já existente! Então fui seguir o outro passo que você ensinou também.

Deletei a migration "add_timestamps_to_series" e dei comando php artisan migrate:fresh. Feito isso, aí eu vi e entendi o que você explicou, apagou tudo mesmo salvo do banco e voltou a ter também aquele problema de não ter, ainda, timestamps, já que não editei na migration existente antes deste fresh.. Então editei a migration existente adicionando timestamps(); e dei novamente php artisan migrate:fresh. Agora sim adiciona funcionando certinho. Então entendi como funciona o fresh...

Mas realmente gostaria de não apagar o conteúdo do banco. Para isso é obrigatório criar uma migration, como fiz seguindo o começo da sua explicação, ou tem outra forma?

solução!

Tudo bem Amanda, bom ver que você faz vários testes para conhecer as várias possibilidades!

O caminho "ideal" considerado pelo laravel seria criar uma nova migration como você fez, mas é possível sim fazer sem criar uma nova migration e sem apagar todo o banco, mas acredito que você terá que apagar pelo menos a tabela com a migration alterada (tabela series nesse caso) ou então fazer as alterações manualmente no banco sem utilizar migrations.

Por isso o melhor caminho seria criar uma nova migration mesmo, se o problema for o número de migrations (mais de uma para a mesma tabela) você pode criar e executar a nova migration como já fez e depois apagar essa migration e adicionar o conteúdo dela na migration inicial da tabela.


Para editar uma migration já existente e forçar a sua execução você vai ter que ir no banco e apagar a tabela existente, depois disso ainda no banco você vai ter que encontrar a tabela de migrations e apagar a linha referente a migration dessa tabela, assim ao executar php artisan migrate o laravel vai executar a migration novamente.


Como dá para ver nenhuma dessas formas é ideal, são caminhos bem "indiretos".

Eu normalmente sigo o caminho de editar a migration existente e reexecutar tudo apagando o banco, mas faço isso utilizando database seeding, um código para preencher o banco com dados aleatórios (não sei se é abordado nos cursos atuais).