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
操作。仅PUT
、PATCH
、DELETE
需要。
您当前的路由定义是错误的,因为您将trainings/show
与approve
操作连接起来。事实上它应该是一个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 添加表数据时获取未定义的值