首页 > 解决方案 > Laravel 框架中的更新正在返回一条新记录

问题描述

我是 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.');

    }

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

标签: phplaraveleloquentlaravel-8

解决方案


要更新 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();
}

推荐阅读