No laravel 10 / php 8.2 eu tenho um campo de tempo e no modelo eu defini o cast:
<?php
namespace App\Casts;
use Carbon\Carbon;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;
class TimeCast implements CastsAttributes
{
public function get(Model $model, string $key, mixed $value, array $attributes): mixed
{
return Carbon::parse($value)->format('H:i');
}
public function set(Model $model, string $key, mixed $value, array $attributes): mixed
{
return $value;
}
}
e no modelo de item:
protected function casts(): array
{
return [
'time' => TimeCast::class,
];
}
Preciso de um valor de Carbono (com tempo zero) para adicionar outro campo de tempo. Eu faço:
$calcDate = Carbon::parse(Carbon::now(\config('app.timezone')))->startOfDay();
$calcDate->addDays(5);
$item = Item::find($id);
$dateTill = $calcDate->addMinutes($item->time);
dd(Carbon::parse($dateTill));
Mas em $dateTill vejo apenas o valor $calcDate (+5 dias sem tempo).
Como posso fazer isso?
Você está passando 'H:i' para a função addMinutes e esse método aceita apenas valores inteiros.
Uma opção é que na sua opção de conversão você retornará valores em minutos e poderá passar isso diretamente para addMinutes.
Na segunda opção, você retornará o tempo como instância de Carbono e na sua função de adição de tempo você fará uma modificação.
Se quiser adicionar segundos, você também poderá fazer isso acima. No primeiro caso, você precisa retornar segundos e adicionar segundos durante o cálculo.