Laravel 框架中的更新正在返回一条新记录

Posted

技术标签:

【中文标题】Laravel 框架中的更新正在返回一条新记录【英文标题】:An Update in Laravel Framework is returning A new Record 【发布时间】:2021-12-17 11:30:24 【问题描述】:

我是 php 和 Laravel 的新手。我学到了很多东西,但是我发现我在本应是一项简单的任务中犯了错误。

我有一个从 mysql 数据库中的数据填充的表单。当我提交它时,它会创建一个新记录而不是更新现有记录。这是我正在使用的表单操作:

 <form action="route('updateAlert', $alert->id)" method="post" name="saveAlert" id="saveAlert" class="needs-validation"
 @csrf
 @method("PUT")
   ///form fields here
</form>

这是两条相关的路线。 editAlert 将您带到上面的表格。 updateAlert 应该将您带到我的 AlertController 上的更新方法。

Route::get('/alerts/edit/id', 'AlertController@edit')->name('editAlert');
Route::put('/alerts/edit/id', 'AlertController@update')->name('updateAlert');

这是我的 AlertController 的样子:

/**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */

    public function update(Request $request, Alert $alert)
    
        $alert->type = $request->type;
        $alert->title = $request->title;
        $alert->body = $request->body;
        $alert->link = $request->link;
        $alert->eff_dt = Carbon::parse($request->eff_dt);
        $alert->exp_dt = Carbon::parse($request->exp_dt);
        $alert->note = $request->note;
        $alert->user_id = auth()->user()->id;
        $alert->save();

        return redirect()->route('viewAlerts')->with('success', 'Your alert has been updated.');

    

我错过了什么?我在应用程序的另一部分有相同的基本代码,它按预期工作。提前致谢。

【问题讨论】:

因为您的控制器方法的类型提示参数与您定义的路由参数的名称不匹配...如果您希望发生隐式绑定,它们必须匹配,否则您将获得依赖注入成为一个新的不存在的模型实例.. laravel.com/docs/8.x/routing#implicit-binding 你的路由应该看起来像Route::put('/alerts/edit/alert',然后当你的方法类型提示update(Request $request, Alert $alert)时会找到模型。 【参考方案1】:

您没有获取您的行 ID。您需要使用模型并将您的 id 传递给您的模型以更新任何特定行。

例如。 我的型号名称只是传递您的型号名称。

    public function update(Request $request, Alert $alert)
    
            $alert          = ModelName::find($alert);
            $alert->type    = $request->type;
            $alert->title   = $request->title;
            $alert->body    = $request->body;
            $alert->link    = $request->link;
            $alert->eff_dt  = Carbon::parse($request->eff_dt);
            $alert->exp_dt  = Carbon::parse($request->exp_dt);
            $alert->note    = $request->note;
            $alert->user_id = auth()->user()->id;
            $alert->save();
            return redirect()->route('viewAlerts')->with('success', 'Your alert has been updated.');

    

【讨论】:

这是一个短视的解决方案。 Laravel 的方法是使用路由模型绑定,OP 是 90% 的正确方法。忽略这一点并手动查找模型并不是一个好的解决方案。【参考方案2】:

要更新 Laravel 中的内容,您需要一个查询构建器对象; Alert $alert 返回模型的对象,所以不能用来更新东西。

注意:find 方法是一种特殊方法,其对象可用于更新记录,与“first”方法不同。

所以你的代码必须改成:

public function update(Request $request, Alert $alert)

   $alert = Alert::where('id', $alert->id); // or: Alert::find($alert->id);
   $alert->type = $request->type;
   $alert->title = $request->title;
   $alert->body = $request->body;
   $alert->link = $request->link;
   $alert->eff_dt = Carbon::parse($request->eff_dt);
   $alert->exp_dt = Carbon::parse($request->exp_dt);
   $alert->note = $request->note;
   $alert->user_id = auth()->user()->id;
   $alert->save();

【讨论】:

这是一个短视的解决方案。 Laravel 的方式是使用路由模型绑定,OP 是 90% 的正确方式。忽略这一点并手动查找模型并不是一个好的解决方案。

以上是关于Laravel 框架中的更新正在返回一条新记录的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ::all() 命令只返回 1 条记录

Laravel 5.5 检索嵌套关系中的第一条记录

Laravel 5 更新记录返回 false

Laravel - 保存与更新

验证中的 Laravel 多元化

无法删除或更新父行:Laravel