我正在尝试制作一个Laravel应用程序,该应用程序允许登录的用户编辑其纪念页之一。编辑视图可以使用,但是一旦保存更改,它就会在错误时抛出调用成员函数update()。我是 Laravel 的新手,如果这是一个愚蠢的问题,我深表歉意。
控制器:
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 \App\User $user
* @param \App\Memorial $memorial
* @return mixed
*/
public function update(User $user, Memorial $memorial)
{
return $user->id == $memorial->user_id;
}
答案 0 :(得分:2)
可能有一些原因导致此错误。我认为首先要调查的是您的关系与您要更新的内容。
您的用户模型具有许多纪念意义:
public function memorials(){
return $this->hasMany(Memorial::class);
}
您的控制人正在尝试更新一个纪念馆:
auth()->user()->memorial->update($data);
要解决此问题,建议您尝试直接更新有问题的纪念馆,而不要通过用户关系进行更新。我假设纪念馆上有一个user_id
键-在更新已经注入到update方法中的纪念馆时添加它即可。
答案 1 :(得分:1)
您的关系不正确...您在用户模型中没有纪念关系。因此它返回null
您可以按照以下代码轻松编辑一个纪念馆:
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时授权您检查隐私
答案 2 :(得分:1)
所以我看到的原因是: 在用户模型中,您定义内存关系:
public function memorials()
{
return $this->hasMany(Memorial::class);
}
在您调用的update()函数中: auth()-> user()-> memorial-> update($ data); 您正在调用模型,并且它建议获取纪念模型的属性。
您需要像这样致电: 在函数update()中:
auth()-> user()-> memorials()-> update($ data)
在用户模型中
/**
* Eloquent:User
*
* //relation
* @property Collection|Memorial[] $memorials
*/
class User extends Model