Kontynuacja lekcji poprzedniej – piszemy kolejne komendy w naszym projekcie, poznając wszystkie możliwości Laravela. Do dzieła.
Ok, komenda get-by-name:
Artisan::command('get-by-name {name}', function (string $name) {
$people = Person::where('firstName', $name)
->orWhere('lastName', $name)
->get();
foreach($people as $person){
$this->comment("Name: {$person->firstName} {$person->lastName}");
$this->comment("Age: {$person->age}");
$this->comment("Created at: {$person->created_at}");
}
});
To samo, ale z użyciem DB:
Artisan::command('get-by-name-db {name}', function (string $name) {
$people = DB::table('people')
->where('firstName', $name)
->orWhere('lastName', $name)
->get();
foreach($people as $person){
$this->comment("Name: {$person->firstName} {$person->lastName}");
$this->comment("Age: {$person->age}");
$this->comment("Created at: {$person->created_at}");
}
});
Komenda stats:
Artisan::command('stats', function () {
$minAge = Person::min('age');
$maxAge = Person::max('age');
$avgAge = round(Person::avg('age'), 2);
$this->comment("Min age: $minAge");
$this->comment("Max age: $maxAge");
$this->comment("Avg age: $avgAge");
});
To samo, ale używamy DB:
Artisan::command('stats-db', function () {
$minAge = DB::table('people')->min('age');
$maxAge = DB::table('people')->max('age');
$avgAge = round(DB::table('people')->avg('age'), 2);
$this->comment("Min age: $minAge");
$this->comment("Max age: $maxAge");
$this->comment("Avg age: $avgAge");
});
Teraz coś, co użyje metody eloquenta firstWhere:
Artisan::command('first-where-age {age}', function (int $age) {
$person = Person::firstWhere('age', $age);
$this->comment("Name: {$person->firstName} {$person->lastName}");
$this->comment("Age: {$person->age}");
$this->comment("Created at: {$person->created_at}");
});
Teraz odwrotność tej komendy, last-where-age:
Artisan::command('last-where-age {age}', function (int $age) {
$person = Person::where('age', $age)->get()->last();
$this->comment("Name: {$person->firstName} {$person->lastName}");
$this->comment("Age: {$person->age}");
$this->comment("Created at: {$person->created_at}");
});
Dodajmy, bo to ważne, że firstWhere to metoda eloquent ORMa – generalnie każdy model ma metody statyczne, które przechodzą w tzw. composable query, które kontynuujemy już niestatycznymi i na koniec używamy get, co zwraca nam klasę collection.
To klasa collection ma metodę last.
Warto to sobie uzmysłowić, jak to działa:
- Model ma różne metody statyczne, które wykonujemy raz (jeden scope resolution operator ::), i które są metodami composable query (np. where)
- Te metody zwracają composable query, które można chainować (niestatycznymi odpowiednikami tych metod)
- Na koniec musi być jakaś metoda (np. get), która to query zamieni na kolekcję
Super łatwe to nie jest, ale trzeba zrozumieć, że tak to działa.