在 null [LARAVEL] 上调用成员函数 update()



我正在尝试制作一个Laravel应用程序,允许登录用户编辑他们的一个纪念页面。编辑视图可以工作,但是一旦保存更改,它就会在空错误时抛出对成员函数 update(( 的调用。我是拉拉维尔的新手,所以如果这是一个愚蠢的问题,我深表歉意。

控制器:

public function edit(Memorial $memorial)
{
$this->authorize('update', $memorial);
return view('memorials.edit', compact('memorial'));
}
public function update(Memorial $memorial)
{
$this->authorize('update', $memorial);
$data = request()->validate([
'fname' => 'required',
'lname' => 'required',
'bio' => '',
]);
auth()->user()->memorial->update($data);
return redirect("/memorial/{$memorial->id}");
}

视图:

<div class="container pt-5">
<form action="/memorial/{{ $memorial->id }}" enctype="multipart/form-data" method="POST">
<legend>Edit Memorial</legend>
@csrf
@method('PATCH')
<div class="form-group">
<div class="form-row">
<div class="col-6">
<input id="fname" type="text" class="form-control @error('fname') is-invalid @enderror" name="fname" placeholder="First Name" value="{{ old('fname') ?? $memorial->fname }}" autofocus>
@error('fname')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
<div class="col-6">
<input id="lname" type="text" class="form-control @error('lname') is-invalid @enderror" name="lname" placeholder="Last Name" value="{{ old('lname') ?? $memorial->lname }}">
@error('lname')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="form-group">
<div class="form-row">
<div class="col-6">
<input id="bio" type="text" class="form-control @error('bio') is-invalid @enderror" name="bio" placeholder="Biography" value="{{ old('bio') ?? $memorial->bio }}">
@error('bio')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="form-group">
<div class="form-row">
<div class="col-12">
<button class="btn btn-primary">Save</button>
</div>
</div>
</div>
</form>

政策:

/**
* Determine whether the user can update the memorial.
*
* @param  AppUser  $user
* @param  AppMemorial  $memorial
* @return mixed
*/
public function update(User $user, Memorial $memorial)
{
return $user->id == $memorial->user_id;
}

有一些原因可能会导致此错误。 我认为首先要调查的是你们的关系与你试图更新的内容。

您的用户模型有许多纪念馆:

public function memorials(){
return $this->hasMany(Memorial::class);
} 

您的控制器正在尝试更新一个纪念馆:

auth()->user()->memorial->update($data);

为了解决这个问题,我建议你尝试直接更新有问题的纪念馆,而不是通过用户关系。 我假设纪念碑上有一个user_id键 - 只需在更新已注入更新方法的纪念碑时添加它即可。

你的关系不正确...用户模型中没有纪念关系。所以它返回空

您可以按照以下代码轻松编辑一个纪念馆:

public function update(Memorial $memorial)
{
$this->authorize('update', $memorial);
$data = request()->validate([
'fname' => 'required',
'lname' => 'required',
'bio' => '',
]);
$memorial->update($data);
return redirect("/memorial/{$memorial->id}");
}

因为在授权中,您在编辑时检查隐私$memorial这就是您需要的

所以我看到原因是: 在用户模型中,定义内存关系:

public function memorials() 
{ 
return $this->hasMany(Memorial::class); 
}

在函数 update(( 中,你调用: auth((->user((->memorial->update($data(; 您正在调用一个模型,并且它已建议获取纪念模型的属性。

你需要像这样打电话: 在函数更新((:

auth((->user((->memorials((->update($data(

在用户模型中

/**
* Eloquent:User
*
* //relation
* @property Collection|Memorial[] $memorials
*/
class User extends Model

前提是你已经正确设置了你的关系

意味着你根本没有纪念馆,即没有与该user_id相关的纪念记录,所以没有什么可更新的,这就是我们所说的关系null意味着它不存在。

你永远不会知道用户是否与纪念记录有关系,所以诀窍是创建它,如果它不存在,或者用下面简单的雄辩代码更新它,如果它存在,它就更新它

auth()->user()->memorial->updateOrCreate($data);

相关内容

  • 没有找到相关文章

最新更新