Laravel创建控制器方法以更新1行中的1列

时间:2019-01-28 18:27:44

标签: php laravel eloquent

我正在建立一个用于狗窝的网站,并且我想创建一个按钮来标记该狗已被收养。换句话说,我正在尝试从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的骨架就在那里。

我错过了什么吗?还是有更好的方法呢?

1 个答案:

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