更新在 Laravel 8 的资源控制器中不起作用
Update not working in Resource Controller for Laravel 8
之前,我尝试了几个小时来让我的“destroy()”函数正常工作。这对你们大多数人来说听起来很荒谬,但只需将“方法(“DELETE”)”放在表单中就可以了,我仍然不明白为什么。
现在,我受困于 update() 函数。一旦我点击更新,页面就会重新加载并且什么都不做。它不会更新数据库中的信息,也不会将我重定向回索引。这是代码:
路线(web.php):
Route::resource('books', BookController::class);
表格 (Edit.blade.php):
@section('content')
<div class="row">
<div class="col-lg-12">
<form action="{{ route('books.update', $book->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3 mt-3">
<label for="exampleFormControlInput1" class="form-label">Book Title</label>
<input type="text" name="title" class="form-control" value="{{ $book->title }}">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">Book Author</label>
<input type="text" name="author" class="form-control" value="{{ $book->author }}" placeholder="Author Name..">
</div>
<div class="btn-group" role="group">
<button type="submit" class="btn btn-block btn-danger">Update</button>
<a href="{{ route('books.index') }}"><button type="button" class="btn btn-success">Go Back</button></a>
</div>
</form>
</div>
</div>
@endsection
控制器(BookController):
public function update(Request $request, Book $book)
{
$validated = $request->validate([
'title' => 'required|max:255|unique:books',
'author' => 'required|max:255'
]);
Book::where('id',$book->id)->update($validated);
return redirect()->route('books.index')->with('message','Book Updated!');
}
我在这里做错了什么?一些帮助将不胜感激。
我认为问题在于您的独特验证。当您不更改表单中的标题并点击更新时,唯一验证将失败。它失败了,因为标题已经存在于数据库中。我们必须跳过正在更新的资源的唯一验证。
$validated = $request->validate([
'title' => 'required|max:255|unique:books,title,'.$book->id, // <-- change this
'author' => 'required|max:255'
]);
$book->update( $request->only(['title', 'author']) );
之前,我尝试了几个小时来让我的“destroy()”函数正常工作。这对你们大多数人来说听起来很荒谬,但只需将“方法(“DELETE”)”放在表单中就可以了,我仍然不明白为什么。
现在,我受困于 update() 函数。一旦我点击更新,页面就会重新加载并且什么都不做。它不会更新数据库中的信息,也不会将我重定向回索引。这是代码:
路线(web.php):
Route::resource('books', BookController::class);
表格 (Edit.blade.php):
@section('content')
<div class="row">
<div class="col-lg-12">
<form action="{{ route('books.update', $book->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3 mt-3">
<label for="exampleFormControlInput1" class="form-label">Book Title</label>
<input type="text" name="title" class="form-control" value="{{ $book->title }}">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">Book Author</label>
<input type="text" name="author" class="form-control" value="{{ $book->author }}" placeholder="Author Name..">
</div>
<div class="btn-group" role="group">
<button type="submit" class="btn btn-block btn-danger">Update</button>
<a href="{{ route('books.index') }}"><button type="button" class="btn btn-success">Go Back</button></a>
</div>
</form>
</div>
</div>
@endsection
控制器(BookController):
public function update(Request $request, Book $book)
{
$validated = $request->validate([
'title' => 'required|max:255|unique:books',
'author' => 'required|max:255'
]);
Book::where('id',$book->id)->update($validated);
return redirect()->route('books.index')->with('message','Book Updated!');
}
我在这里做错了什么?一些帮助将不胜感激。
我认为问题在于您的独特验证。当您不更改表单中的标题并点击更新时,唯一验证将失败。它失败了,因为标题已经存在于数据库中。我们必须跳过正在更新的资源的唯一验证。
$validated = $request->validate([
'title' => 'required|max:255|unique:books,title,'.$book->id, // <-- change this
'author' => 'required|max:255'
]);
$book->update( $request->only(['title', 'author']) );