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.