我正在建立一个用于狗窝的网站,并且我想创建一个按钮来标记该狗已被收养。换句话说,我正在尝试从1行更新1列。它将始终从false设置为true。
我尝试在现有的控制器中创建自己的方法,添加路由并创建表单,但是我收到一些错误,指出还需要一些其他字段,当我创建新狗时,这些字段是必填字段(名称,性别,DoB等)。
我的控制器中方法的代码:
public function markAsAdopted(Request $request, $id){
$pet = Pet::table('pets')->where('id', $id)->update(['is_adopted' => true]);
return redirect("/pets/$pet->id")->with('success', 'Successfully marked as adopted');
}
路线代码:
Route::patch('/pets/{id}', 'PetsController@markAsAdopted');
格式的代码:
{!! Form::open(['action' => ['PetsController@markAsAdopted', $pet->id], 'method' => 'POST', 'class' => 'float-right ml-1 mr-1']) !!}
{{Form::hidden('_method', 'PATCH')}}
{{Form::submit('Mark as adopted', ['class' => 'btn btn-success'])}}
{!! Form::close() !!}
该表格在/ pets / {id}页面上 创建控制器时,我已使用--resource标志在此控制器中创建了所有其他路由,因此CRUD的骨架就在那里。
我错过了什么吗?还是有更好的方法呢?
答案 0 :(得分:1)
Laravel将markAsAdopted
调用路由到您的update()
(或者可能是create()
,具体取决于您如何设置路由),而不是markAsAdopted()
方法。反过来,这就是调用PetsRequest类(或您称为验证类的任何类)。
它很可能以POST的形式出现,并且可能忽略了PATCH方法,因此被路由到update()
。您可以做几件事-在Routes文件中将patch方法移到更高的位置,然后通过更改为POST进行测试。如果这可行,那么您知道这是问题所在。这只是一个测试-您将破坏Routes文件中它下方的其他宠物POST,因此请记住将其更改回:)
我通常会完全跳过PATCH,因为我遇到了类似的问题。通常,我只使用特殊名称(例如Route::post('/petsMarkAsAdopted/{id}', 'PetsController@markAsAdopted');
)创建POST路由,然后使用该特殊路由的url打开表单。
如果您真的想保留PATCH,请执行上述更高的放置测试,然后在打开表单后使用blade设置方法,如下所示:
@method('PATCH')
编辑:如注释中所述,以上内容解决了路由问题,但是现在我们可以访问您的控制器方法了,这是一个不同的问题。取出table()
,然后调用模型以获取您需要的宠物。为了清楚起见,我将电话分开了:
$pet = Pet::where('id', $id)->first();
$pet->update(['is_adopted' => true]);