Uczymy się tworzyć funkcję, która oblicza różnicę w latach między created_at a czasem obecnym. Poznajemy lepiej Carbon. Do dzieła.

Ok, początkowo nasza funkcja będzie wyglądać tak:

Artisan::command('diff-in-years {id}', function (int $id) {

    $person = Person::findOrFail($id);
   
    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");

});

Przyjmuje ID, szuka, wyświetla informacje. Teraz obliczanie różnicy:

Artisan::command('diff-in-years {id}', function (int $id) {

    $person = Person::findOrFail($id);

    $now  = \Carbon\Carbon::now();
    $then = \Carbon\Carbon::parse($person->created_at);

    $diff = $then->diffInYears($now);
    
    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");

    $this->comment("Diff in years: {$diff}");
});

Wszystko fajnie, tylko zwraca nam coś takiego:

Name: Emma Ortiz
Age: 15
Created at: 2023-10-26 06:11:27
Diff in years: 0.80671111096561

Name: Evalyn Miller
Age: 33
Created at: 2022-12-27 20:35:11
Diff in years: 1.63567431594

Różnica musi być bezwzględnie zaokrąglana w dół. 0.8 roku to 0 lat zaś 1.6 roku to 1 rok, nie więcej:

Artisan::command('diff-in-years {id}', function (int $id) {

    $person = Person::findOrFail($id);

    $now  = \Carbon\Carbon::now();
    $then = \Carbon\Carbon::parse($person->created_at);

    $diff = floor($then->diffInYears($now));
    
    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");

    $this->comment("Diff in years: {$diff}");
});

Możemy jeszcze wykorzystać Carbona do formatowania:

Artisan::command('diff-in-years {id}', function (int $id) {

    $person = Person::findOrFail($id);

    $now  = \Carbon\Carbon::now();
    $then = \Carbon\Carbon::parse($person->created_at);

    $diff = floor($then->diffInYears($now));

    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$then->format('Y')}");

    $this->comment("Diff in years: {$diff}");
});

// Name: Emma Ortiz
// Age: 15
// Created at: 2023
// Diff in years: 0

Ok, to by było na tyle. Przyda się później, warto odnotować.