Poznajemy akcesory w modelach Laravela – po staremu i po nowemu. Do dzieła!

Ok, po staremu, dla referencji:


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

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

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

    public function getFullNameAttribute()
{
  return $this->first_name . " " . $this->last_name;
}
}

Ok, atrybut „nieistniejący” (nie mający odpowiednika w kolumnie w bazie danych):


namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

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();
    }

    protected function fullName(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->firstName . " " . $this->lastName,
        );
    }
}

Teraz użycie:

Artisan::command('fullname-attr {id}', function (int $id) {

    $person = Person::findOrFail($id);
    
    $this->comment("Name: {$person->full_name}");
    $this->comment("Age: {$person->age}");
   
});

Konwencje nazewnicze są jakie są, trzeba się przyzwyczaić.