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ć.