php - 更新在 Laravel 8 的资源控制器中不起作用

以前,我尝试了几个小时来让我的“destroy()”函数正常工作。这对你们大多数人来说听起来很荒谬,但只需将“方法(“DELETE”)”放在表单中就可以了,我仍然不知道为什么。

现在,我坚持使用 update() 函数。一旦我点击更新,页面就会重新加载并且什么都不做。它不会更新数据库中的信息,也不会将我重定向回索引。这是代码:

路线(web.php):

Route::resource('books', BookController::class);

表格(编辑。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!');
}

我在这里做错了什么?一些帮助将不胜感激。

回答1

我认为问题在于您的独特验证。当您不更改表单中的标题并点击更新时,唯一验证将失败。它失败了,因为标题已经存在于数据库中。我们必须跳过对正在更新的资源的唯一验证。

$validated = $request->validate([
    'title' => 'required|max:255|unique:books,title,'.$book->id,  // <-- change this
    'author' => 'required|max:255'
]);

$book->update( $request->only(['title', 'author']) );

相似文章

最新文章