【问题标题】:Laravel: Update value of a column on button clickLaravel:单击按钮时更新列的值
【发布时间】: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

感谢您的帮助

【问题讨论】:

    标签: php jquery mysql laravel eloquent


    【解决方案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
      • 对不起,我没看到,好吧,现在它触发了我在控制器中更新方法的错误验证消息,我现在有点困惑,而且它也没有更新表格:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多