Home > Back-end >  getAttributeName return old version of avatar
getAttributeName return old version of avatar

Time:10-06

Hi All users have avatar butit could be change. But users can chave a collection of avatars and can change if it want. So i created a relationship between model Avatar and Profile and I append avatar_name into my model

protected $appends = [
    'avatar_name'

];
public function avatar() {
    return $this->hasOne(Avatar::class);
}

public function avatars() {
    return $this->hasMany(Avatar::class);
}
public function getAvatarNameAttribute(){
    return $this->attributes['avatar_name'] = isset($this->avatar->name) ? $this->avatar->name : null;
}

It works until user change avatar. For example: user has avatar Hello.jpg (id: 1) and he want to change that to World.jpg (id: 2) [id from avatars table]. So after change Profile look like this:

avatar_id: 1,
avatar_name: Hello.jpg

User change the avatar (avatar_id) but avatar_name will be still this same, so after change this will be look like this:

avatar_id: 2,
avatar_name: Hello.jpg

Why it works that? Would it be possible to makeh avatar_name change dynamically along with avatar_id?

CodePudding user response:

Did you try to add ->latest()?

Example:

public function avatar() {
    return $this->hasOne(Avatar::class)->latest();
}

CodePudding user response:

Change the conditional operator from this

isset($this->avatar->name) ? $this->avatar->name : null;

to this

isset($this->avatar_name) ? $this->avatar_name : null;

So the respective line of code will be

public function getAvatarNameAttribute(){
    return $this->attributes['avatar_name'] = isset($this->avatar_name) ? $this->avatar_name : null;
}

Hope this will help you...

CodePudding user response:

In Model

public function avatar() {
    return $this->hasOne(Avatar::class); // return first avatar
    // or
    return $this->hasOne(Avatar::class)->latest(); // return last avatar
}


protected $appends = ['avatar_name'];
protected $hidden = ['avatar'];

public function getAvatarNameAttribute(){
    return $this->avatar->name ?? null; // PHP 7.4 and above version
    // else
    return isset($this->avatar->name) ? $this->avatar->name : null;
}
  • Related