Hey, I'm using laravel 9 and I have a relationship between two models in my application: User and Profile. The User model has a hasOne relationship with the Profile model. When I try to run the update method from the profile controller, I get the error: Indirect modification of overloaded property AppUser::$profile is not valid. This is my update method:
public function update(Request $request){ $this->validate($request,[ 'name'=>'required', 'province'=>'required', 'bio'=>'required', ]); $user=Auth::user(); $user->name= $request->name; $user->profile->province= $request->province; $user->profile->gender= $request->gender; $user->profile->bio= $request->bio; $user->profile->faceb ook= $request->fac ebook; $user->save(); $user->profile->save(); if($request ->has('password')) { $user->password= bcrypt($request->password); $user->save(); } return Redirect()->back(); }
This is the user model
class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ 'email_verified_at' => 'datetime', ]; /** * Get the user associated with the User * * @return IlluminateDatabaseEloquentRelationsHasOne */ public function profile(): HasOne { return $this->hasOne(profile::class); } }
This is the profile model
class profile extends Model { use HasFactory; protected $table ='profile_users'; protected $primarykey='user_id'; protected $fillable = ['province','user_id','bio','fa cebook' ]; /** * Get the user that owns the profile * * @return IlluminateDatabaseEloquentRelationsBelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id' ); } } class profile extends Model { use HasFactory; protected $table ='profile_users'; protected $primarykey='user_id'; protected $fillable = ['province','user_id','bio','fa cebook' ]; /** * Get the user that owns the profile * * @return IlluminateDatabaseEloquentRelationsBelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id' ); } }
New code:
public function update(Request $request){ $this->validate($request,[ 'name'=>'required', 'province'=>'required', 'bio'=>'required', ]); $user=Auth::user(); $profile = $user->profile()->firstOrNew(); $profile->whatever = 'whatever'; $user->name= $request->name; $user->profile->province= $request->province; $user->profile->gender= $request->gender; $user->profile->bio= $request->bio; $user->profile->facebo ok= $request->fa cebook; $user->save(); $profile->save(); if($request ->has('password')) { $user->password= bcrypt($request->password); $user->save(); } return Redirect()->back(); }
P粉7162282452023-11-09 10:36:56
Dump code from comments:
$user = Auth::user(); $user->name = $request->name; $user->save(); $profile = $user->profile()->firstOrNew(); $profile->province = $request->province; $profile->gender = $request->gender; $profile->bio = $request->bio; $profile->facebook = $request->facebook; $profile->save();
I obviously don't mean to actually use ->whatever
; this is just an example; with the correct attributes, your code should work.