php - Laravel 创建控制器方法从 1 行更新 1 列
问题描述
我正在为狗收容所制作一个网站,我想制作一个按钮,将狗标记为收养。换句话说,我正在尝试从 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 的骨架就在那里。
我错过了什么?或者有没有更好的方法来做到这一点?
解决方案
Laravel 将markAsAdopted
调用路由到您的update()
(或者可能create()
取决于您设置路由的方式)而不是markAsAdopted()
方法。这反过来又会调用您的 PetsRequest 类(或任何您称之为验证类的东西)。
它很可能以 POST 的形式出现,并可能忽略 PATCH 方法,因此路由到update()
. 您可以做几件事 - 在 Routes 文件中将补丁方法移到更高的位置并通过更改为 POST 进行测试。如果这有效,您就知道这是问题所在。这只是一个测试——你会在 Routes 文件中破坏它下面的其他宠物 POST,所以记得把它改回来 :)
不过,我通常会完全跳过 PATCH,因为我遇到了类似的问题。我通常只使用特殊名称(例如)创建一个 POST 路由,Route::post('/petsMarkAsAdopted/{id}', 'PetsController@markAsAdopted');
然后打开带有该特殊路由的 url 的表单。
如果你真的想保留 PATCH,做上面的高位测试,你可以在打开表单后使用刀片设置方法,如下所示:
@method('PATCH')
编辑: 如评论中所述,上述修复了路由,但现在我们可以访问它,您的控制器方法中存在不同的问题。取出table()
,然后打电话给模特来获取您需要的宠物。为了清楚起见,我已将电话分开:
$pet = Pet::where('id', $id)->first();
$pet->update(['is_adopted' => true]);
推荐阅读
- amazon-web-services - 嵌套 AWS Cloudformation 堆栈与使用 SSM 参数存储
- python - 为什么没有安装 Pydot?
- php - 在 PHP 中处理混合二进制文件以登录 MongoDB
- django - 根据值自定义drf序列化程序的json输出中的键名
- java - 无法设置属性 setProperty
- javascript - 删除在 ng-selectize 上选择的当前元素?
- html - 即使 div 是 margin:auto,我的 div class:"title" 似乎也没有居中。我该如何解决?
- c++ - 是否可以在类内部构造一个类?
- python - 使用带参数的 Python 调用外部 *.exe,没有错误但没有输出
- regex - 我想使用 grep 提取“&”之前的单词