Php Laravel 8表格更新数据库

Php Laravel 8表格更新数据库,php,html,laravel,forms,Php,Html,Laravel,Forms,我正在创建一个简单的博客网站,在Laravel8中具有CRUD功能。在使用不推荐使用的Laravel表单之前,我已经这样做了,但现在我尝试使用HTML表单。 然而,我对网站的更新部分有一些问题。我有一个名为BlogsController的控制器,可以调用这个函数来更新数据库中的blog,当用户提交表单进行更新时,应该调用这个函数。 博客控制器更新功能 public function update(Request $request, $id) { $this->va

我正在创建一个简单的博客网站,在Laravel8中具有CRUD功能。在使用不推荐使用的Laravel表单之前,我已经这样做了,但现在我尝试使用HTML表单。
然而,我对网站的更新部分有一些问题。我有一个名为BlogsController的控制器,可以调用这个函数来更新数据库中的blog,当用户提交表单进行更新时,应该调用这个函数。

博客控制器更新功能

public function update(Request $request, $id)
    {
        $this->validate($request, [
            'title' => 'required',
            'body' => 'required',
            'category' => 'required',
            'description' => 'required',    
            'read_time' => 'required'        
        ]);

        $blog = Blog::find($id);        
        $blog->title = $request->input('title');        
        $blog->body = $request->input('body'); 
        $blog->category = $request->input('category');
        $blog->description = $request->input('description');
        $blog->read_time = $request->input('read_time');     
        $blog->user_id = auth()->user()->id;
        $blog->save();

        return redirect('/dashboard')->with('success', 'Blog Updated');
    }
表单需要指向什么操作

更新表单顶部

<form method="POST" action="update">
以Laravel形式实施

{!! Form::open(['action' => ['App\Http\Controllers\BlogsController@update', $blog->id], 'method' => 'POST']) !!}

您可以通过运行

$php artisan路由:列表
对于您的博客更新路径,您应该使用

<form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">
  @method('PATCH')
</form>

@方法('补丁')
在模板中


通过使用
@csrf
,请参阅Laravel文档,确保您在表单中正确设置了令牌。

我假设您正在使用资源路由实现CRUD功能。在这种情况下,资源控制器中的Update方法通过PUT方法而不是POST调用。因此,在表单中,只需添加以下内容即可将表单提交方法更改为:

<input name="_method" type="hidden" value="PUT">

此外,在表单声明中,您必须添加如下目的地路由:

<form method="POST" action="{{ route('blog.update', $blog->id) }}">


拉威尔最酷的一件事是。那是什么意思?我们可以在您的
update
方法中执行类似的操作

// BlogController.php

public function update(Request $request, Blog $blog) {
    $request->validate([
        'title' => 'required',
        'body' => 'required',
        'category' => 'required',
        'description' => 'required',    
        'read_time' => 'required' 
    ]);

    $blog->title = $request->title;
    $blog->body = $request->body;
    $blog->category = $request->category;
    $blog->description = $request->description;
    $blog->read_time = $request->read_time;

    if ($blog->save()) {
        return redirect('/dashboard')->with('success', 'Blog Updated');
    } else {
        // handle error.
    }
}

在模板中,您需要确保使用的是
PATCH
方法:

<form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">
    @csrf
    @method('PATCH')
    ...
</form>

@csrf
@方法('补丁')
...

您还可以选择使用
操作
获取注册路由的URL:

action('App\Http\Controllers\BlogsController@update', ['blog' => $blog])
检查所有路线列表:

        $ php artisan route:list
您的路线应该是:

        <form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">              
           {{csrf_field()}}
           {{ method_field('PATCH') }}
        </form> 

{{csrf_field()}}
{{method_字段('PATCH')}

谢谢,这很有效。我正在尝试做一些类似的删除现在,但由于某种原因,我只是得到重定向到显示后,而不是删除它。知道我做错了什么吗
对于delete,使用相同的语法:
method=“post”
@method('delete')
@ThomasRead您应该添加csrf令牌。。。当您打开表单时,表单生成器会为您添加此库。此库已从core中删除,并由laravel collective接管:
        <form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">              
           {{csrf_field()}}
           {{ method_field('PATCH') }}
        </form>