首页 > 解决方案 > 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 的骨架就在那里。

我错过了什么?或者有没有更好的方法来做到这一点?

标签: phplaraveleloquent

解决方案


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]);

推荐阅读