Laravel:单击按钮时更新列的值

Posted

技术标签:

【中文标题】Laravel:单击按钮时更新列的值【英文标题】:Laravel: Update value of a column on button click 【发布时间】:2018-06-04 13:47:15 【问题描述】:

您好,我还是 laravel 的新手,我已经在网上搜索了将近 3 个小时关于这个问题我尝试了很多东西,但没有成功。

所以基本上我有一个带有按钮的页面,当我单击该按钮“批准”时,我想将值从 0 更新为 1(该列是布尔类型)。 这是我的控制器:

public function approve($id)
    $training = Training::find($id);
    $training->update(['Approved' =>'1']);


    // $training->Approved = 1;
   // $training->save();
    return redirect('/trainings')->with('success', 'Training Approved');

这是页面部分,其按钮位于培训文件夹中,名称为“show.blade.php”:

 !!Form::open(['action' => ['TrainingsController@approve',$training->TrainingsID], 'method' => 'POST','class' => 'pull-left'])!!
            Form::hidden('_method','PUT')
            Form::submit('Approve',['class' => 'btn btn-success'])

    !!Form::close()!! 

还有路线(我想这是我做错的部分):

Route::post('/trainings',['as' =>'trainings.show', 'uses' => 'TrainingsController@approve']);

单击按钮时出现的错误是:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

感谢您的帮助

【问题讨论】:

【参考方案1】:

这里不需要方法欺骗,因为您使用了POST 操作。仅PUTPATCHDELETE 需要。

您当前的路由定义是错误的,因为您将trainings/showapprove 操作连接起来。事实上它应该是一个show 动作。

这是应该工作的代码(未经测试)

class TrainingsController extends Controller 

    public function show(Training $training) // Using Route Model binding here 
    
         return view('trainings.show', ['training' => $training]);
    

    public function approve(Training $training) 
    
        $training->update(['Approved' => '1']);

        return redirect()->route('trainings')->with('success', 'Training Approved'); // if you want to redirect to a list of all trainings and would need an index action
        // return redirect()->route('trainings', ['training' => $training])->with('success', 'Training Approved'); // if you want redirect to detail page of this training
    

路由/web.php

Route::post('trainings/training/approve', ['as' => 'trainings.approve', 'uses' => 'TrainingsController@approve']); 
Route::get('trainings/training', ['as' => 'trainings.show', 'uses' => 'TrainingsController@show']);

刀片

!!Form::open('route' => ['trainings.approve', $training->TrainingsID], 'class' => 'pull-left'])!!
    Form::submit('Approve',['class' => 'btn btn-success'])
!!Form::close()!! 

对您的代码的一些评论:

TrainingsID 这样的 ID 是多余的,因为您已经知道这是训练的 ID 坚持snake_case 模型/数据库字段的表/属性名称

【讨论】:

【参考方案2】:

由于路由是post,所以你也应该将表单方法更改为发布:

 Form::hidden('_method','POST') 

或者:

!! Form::open(['method' => 'post', 'action' => ....

您还需要在路由定义中添加id

Route::post('trainings/id', ['as' => 'trainings.show', 'uses' => 'TrainingsController@approve']);

【讨论】:

确实你是对的,但现在我得到这个错误:类型错误:“函数 App\Http\Controllers\TrainingsController::approve() 的参数太少,通过了 0 并且预期正好 1”但是我提供的是 TrainingsID 对吗?所以我不明白 @AbdelKdj 请阅读我回答的第二部分。你改变路线了吗?另外,您正在重定向到return redirect('/trainings'),因此您需要为其设置另一条路线,或者您也想像return redirect('trainings/' . $id)一样传递ID 对不起,我没看到,好吧,现在它触发了我在控制器中更新方法的错误验证消息,我现在有点困惑,而且它也没有更新表格:/

以上是关于Laravel:单击按钮时更新列的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 vue js 和 laravel 添加表数据时获取未定义的值

输入未更改时观察者未触发更新事件 - Laravel

单击按钮时附加新文本字段并通过单击 Laravel 4 中的按钮删除

Laravel 5,单击表单提交按钮时不显示任何内容

单击按钮时Laravel更改数据库列

不允许 Laravel 和 Ajax 更新