Kontynuacja poprzednich lekcji. Eksplorujemy możliwości modelów, ORMa, baz danych. Do dzieła.

Ok, piszemy komendę do postarzania o 1 rok:

Artisan::command('make-older {id}', function (int $id) {

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

    $this->comment("Name: {$person->fullname()}");
    $this->comment("Age: {$person->age}");

    $person->age = $person->age + 1;
    $person->save();

    $this->comment("Updated age: {$person->age}");
   
});

// Name: Manuel Mertz
// Age: 37
// Updated age: 38

Mechanizm jest prosty. Teraz przeniesiemy go do klasy PersonModel:

class Person extends Model
{
    protected $fillable = ['firstName', 'lastName', 'age'];
    use HasFactory;

    public function fullname(){
        return $this->firstName . " " . $this->lastName;
    }

    public function makeOlder($by=1){
        $this->age += $by;
        $this->save();
    }
}

Metodę wywołujemy tak samo, jak fullname:

Artisan::command('make-older {id}', function (int $id) {

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

    $this->comment("Name: {$person->fullname()}");
    $this->comment("Age: {$person->age}");

    $person->makeOlder();

    $this->comment("Updated age: {$person->age}");
   
});

// Name: Manuel Mertz
// Age: 38
// Updated age: 39

Tak po prawdzie, to właśnie makeOlder bardziej pasuje na metodę modelu, niż fullname. Coś na ten fullname jeszcze poradzimy, aby można go było traktować bardziej jako atrybut, ale to w następnej lekcji.

Przykład typowej metody modelu:

public function toggleComplete()
    {
        $this->completed = !$this->completed;
        $this->save();
    }

Tutaj zmieniamy complete (boolean można mniemać) na jego przeciwieństwo. Oczywiście są jeszcze mutatory, akcesory, zasięgi, atrybuty i inne śmieszne rzeczy, które niedługo poznamy.