'carbon generated datetime not stored correctly into the database

I have a tv_shows table where i'm trying to store the start and end datetime of each tv show.

this is my migration:

Schema::create('tv_shows', function (Blueprint $table) {
            $table->id();

            $table->unsignedBigInteger('channel_id');
            $table->foreign('channel_id')->references('id')->on('channels')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->unsignedBigInteger('tv_show_detail_id');
            $table->foreign('tv_show_detail_id')->references('id')->on('tv_show_details')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->dateTime('starting_at');
            $table->dateTime('ending_at');
            $table->timestamps();
        });

this is the factory:

 public function definition()
    {
        $startingAt = Carbon::today()->copy()->addHours($this->faker->randomNumber());

        return [
            'starting_at' => $startingAt->toDateTimeString(),
            'ending_at' => $startingAt->copy()->addHour()->toDateTimeString(),
            'channel_id' => Channel::factory()->create()->id,
            'tv_show_detail_id' => TvShowDetail::factory()->create()->id,
        ];
    }

this is the TvShow model:

class TvShow extends Model
{
    use HasFactory;

    protected $casts = [
        'created_at' => 'datetime:Y-m-d',
        'starting_at' => 'datetime:Y-m-d H:i:s',
        'ending_at' => 'datetime:Y-m-d H:i:s',
    ];
}

if I run Tvshow::factory()->count(4)->make(), I get:

 Illuminate\Database\Eloquent\Collection {#3593
     all: [
       App\Models\TvShow {#3611
         starting_at: Carbon\Carbon @11472638400 {#3570
           date: 2333-07-22 04:00:00.0 UTC (+00:00),
         },
         ending_at: Carbon\Carbon @11472642000 {#3561
           date: 2333-07-22 05:00:00.0 UTC (+00:00),
         },
         channel_id: 1079,
         tv_show_detail_id: 1079,
       },
       App\Models\TvShow {#3617
         starting_at: Carbon\Carbon @1669834800 {#3560
           date: 2022-11-30 19:00:00.0 UTC (+00:00),
         },
         ending_at: Carbon\Carbon @1669838400 {#3589
           date: 2022-11-30 20:00:00.0 UTC (+00:00),
         },
         channel_id: 1080,
         tv_show_detail_id: 1080,
       },
       App\Models\TvShow {#3635
         starting_at: Carbon\Carbon @32836662000 {#3613
           date: 3010-07-21 23:00:00.0 UTC (+00:00),
         },
         ending_at: Carbon\Carbon @32836665600 {#3610
           date: 3010-07-22 00:00:00.0 UTC (+00:00),
         },
         channel_id: 1081,
         tv_show_detail_id: 1081,
       },
       App\Models\TvShow {#3645
         starting_at: Carbon\Carbon @1099374872400 {#3590
           date: 36807-10-21 05:00:00.0 UTC (+00:00),
         },
         ending_at: Carbon\Carbon @1099374876000 {#3607
           date: 36807-10-21 06:00:00.0 UTC (+00:00),
         },
         channel_id: 1082,
         tv_show_detail_id: 1082,
       },
     ],
   }

as you can see in almost all instances the year is wrong it should be 2022 but there is 2333, 3010 and so on. where am I wrong in my code?



Solution 1:[1]

When you do:

$startingAt = Carbon::today()->copy()->addHours($this->faker->randomNumber());

Faker may return anything up to PHP's mt_getrandmax as the randomNumber(). On my system, that's 2147483647.

2147483647 hours is nearly 250,000 years.

If you want realistic dates, consider using one of Faker's date and time functions instead.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1