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.