Erro ao inserir registro com coluna datetime
[Finalizado Pelo Aluno]
Bom dia,
Atualizei o Laravel 8 para o 9 e depois desta atualização, percebi um erro ao inserir registro numa tabela que contém uma coluna datetime. Segue a mensagem de erro:
Olá, Allex!
Tudo bem?
Qual o formato dessa coluna "due_date" no banco de dados?
Você pode fazer o casting deste valor, diretamente no model: https://laravel.com/docs/9.x/eloquent-mutators#date-casting
A coluna é datetime:
Cheguei a testar com o casting, mas continuou com o mesmo erro:
CompanyRelease.php
Incorrect datetime value: '2023-01-22 23:59:59 09:13:36' for column 'due_date' at row 1
Olá, Allex!
Está estranho, ignorou legal o seu cast de data.
Experimenta criar um mutator:
https://laravel.com/docs/9.x/eloquent-mutators#defining-a-mutator
E usa a classe de Carbon para converter a data:
// use Carbon\Carbon;
Carbon::make($date)->format('Y-m-d H:i:s');
Após isso, me diga se deu certo.
Boa tarde,
Agora mudou o erro:
Could not parse '2023-01-24 23:59:59 17:46:42': Failed to parse time string (2023-01-24 23:59:59 17:46:42) at position 20 (1): Double time specification
Não ficou claro o erro, foi a classe de Carbon que gerou a exception?
Quando manda inserir, está retornando o erro acima. Aparentemente é com a conversão da data. Como está passando dois times, deu o erro.
Sim sim, só queria saber de onde veio o erro, e foi da classe de Carbon, ou do Core do Laravel.
--
Sua data tem dois times, por isso o erro na classe de Carbon, e por isso o Eloquent não consegue fazer o casting.
--
Experimenta assim:
Carbon::make($date)->format('Y-m-d');
Acho que vai dar o mesmo erro.
--
Experimenta cortar a string (gambiarra temporária):
$date = '2023-01-24 23:59:59 17:46:42';
$date = substr($date, 0, 19);
Carbon::make($date)->format('Y-m-d H:i:s');
Então, se no service passar da forma abaixo, passa sem erros. Mesmo sem o casting ou o mutator.
A questão é que quando informo o horário, está dando erro. É como se a aplicação concatenasse o horário atual ao final da data e hora que informei.
Deixa assim:
$startDay = now()->addDays(15);
$startDay->copy()->endOfDay();
O local correto para a alteração seria no service ou no model pelo mutator?
Pode ser onde você criou essa data:
$this->repository->insertRelease($company, now()->addDays(15)->endOfDay()->format('Y-m-d'));
Se quiser antes de mudar o código, apenas criar uma rota para testar este formato da data, só para ver se realmente funcionou, isso vai agilizar o seu lado:
Route::get('/test-date', function () {
$startDay = now()->addDays(15);
$finalDate = $startDay->copy()->endOfDay();
dd($finalDate);
});
Fiz a alteração, ficou desta forma:
E continua com o mesmo erro. A diferença é que não pegou a data final do dia. Duplicou o mesmo horário.
Como está o timezone da sua aplicação?
--
Isso é para funcionar:
// use Carbon\Carbon;
Carbon::now()->addDays(15)->format('Y-m-d H:i:s');
Mesmo erro anterior, repetiu o horário duas vezes. O time zone está assim:
Rodei um teste aqui para ter certeza, e veja, funciona certinho o código que passei: https://prnt.sc/jP_1aG5XAJsP
Talvez, está gerando em outro local a data, se quiser compartilhar o código comigo.
A data e hora no service é gerada como preciso, 2023-01-25 23:59:59. O problema é que ao usar o eloquent para gravar no banco, está concatenando o horário atual ao final do dado, exemplo: 2023-01-25 23:59:59 08:35:15.
Como posso compartilhar o código contigo?
Obrigado pela atenção.
Compartilha pelo GitHub, se possível! :-)
Qual conta no Google para compartilhar?
Conta do GitHub.
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!