【问题标题】:Save method won't update models that already exist in the DBSave 方法不会更新数据库中已经存在的模型
【发布时间】:2016-07-04 03:24:11
【问题描述】:

我正确检索数据库中的记录并打印出文本字段中的值。但是当我想更新我的数据库时,它就行不通了。它在文档中说

save() 方法也可以用来更新已经存在的模型 在数据库中。要更新模型,您应该检索它。

所以我有两个刀片模板 showedit。第一个刀片显示数据库中存在的值 (GET REQUEST)。第二个刀片显示用户更新数据的编辑表单。 (发布请求)。

show.blade.php

<form class = "form-vertical" role = "form" method = "post" action = "{{ route ('account.show', $result->id) }}">

<h3>View Employee</h3>
<hr>

<div class = "form-group">

    <label for = "email" class = "control-label">Email Address</label>
    <input type = "text" name = "email" class = "form-control" placeholder = "{{ $result->email }}" readonly>

</div>

<div class = "form-group">

    <label for = "username" class = "control-label">Username</label>
    <input type = "text" name = "username" class = "form-control" placeholder = "{{ $result->username }}" readonly>

</div>

<input type = "hidden" name = "_token" value = "{{ Session::token() }}">

</form>

edit.blade.php

<form class = "form-vertical" role = "form" method = "post" action = "{{ route ('account.edit', $result->id) }}">

<h3>Edit Employee</h3>
<hr>

<div class = "form-group">

    <label for = "email" class = "control-label">Email Address</label>
    <input type = "text" name = "email" class = "form-control" value = "{{ $result->email }}">

</div>

<div class = "form-group">

    <label for = "username" class = "control-label">Username</label>
    <input type = "text" name = "username" class = "form-control" value = "{{ $result->username }}">

</div>

<div class = "form-group">

    <button type = "submit" class = "btn btn-success">Save</button>

</div>

<input type = "hidden" name = "_token" value = "{{ Session::token() }}">

</form>

控制器:

//SHOW
public function showEmployee($id)
{
    $result = User::find($id);

                                        //key     //value
    return view ('account.show')->with('result', $result);
}

//EDIT
public function editEmployee($id)
{

    $result = User::find($id);

    return view ('account.edit')->with('result', $result);
}

//UPDATE
public function updateEmployee(Request $request, $id)
{
    $this->validate($request, [
                            //This will be unique in users table
        'email' => 'required|unique:users,email,'.$id.'|email|max:255',
        'username' => 'required|unique:users,username,'.$id.'|alpha|max:20',
    ]);

    $email = $request['email'];
    $username = $request['username'];

    $user = User::findOrFail($id); 
    $user->email = $email; //Accessing properties of Model
    $user->username = $username;

    $user->save();

    return view ('account.show');
}

路线:

//SHOW
Route::get('/show/{id}',
[
    'uses' => '\App\Http\Controllers\AccountController@showEmployee',
    'as' => 'account.show',
]);

//EDIT
Route::get('/edit/{id}',
[
    'uses' => '\App\Http\Controllers\AccountController@editEmployee',
    'as' => 'account.edit',
]);


//UPDATE
Route::post('/edit/{id}',
[
    'uses' => '\App\Http\Controllers\AccountController@updateEmployee',
    'as' => 'account.edit',
]);

【问题讨论】:

  • 我不是 laravel 方面的专家,但我认为问题在于您正在创建一个新用户,填写名称然后尝试保存它,所以 laravel 认为您正在尝试保存重复的对象...您应该先验证对象是否已经存在...如果存在,请获取它然后修改字段并保存它,否则只需创建一个新的并保存它。
  • 我只是按照文档说我可以使用相同的方法进行更新,即 save() 但在此之前我应该​​先检索值。
  • 是的,您应该这样做,因为通过获取它,您正在获取用户 ID 和已保存的其他字段,然后您可以根据更新的对象(代表数据库的真实状态)。但是......请记住,我没有使用 laravel 的经验,我只是想给你周日的帮助

标签: php laravel laravel-5.2


【解决方案1】:

您正在这里创建一个新的User

要更新现有数据,您需要先加载要编辑的用户数据。您可以这样做并通过更改来解决该问题

$user = new User();

$user = User::findOrFail($id); 

(假设$id是该用户的id)

此外,如果用户名和电子邮件均未更改,则此处的验证将失败,因为您正在检查两个条目的唯一性,并且当前用户已经拥有该用户名或电子邮件。

要解决此问题,您需要通过类似这样的方式将当前用户排除在检查之外以进行验证,

  'email' => 'required|unique:users,email,'.$id.'|email|max:255',
  'username' => 'required|unique:users,username,'.$id.'|alpha|max:20',

有关详细信息,请参阅此处文档中的“强制使用唯一规则忽略给定 id” - Validation - unique rule

【讨论】:

  • 我没想到它可以在验证中连接$id。最后一个问题。当我点击按钮时,它给了我一个错误Undefined variable: result (View: C:\Users\JohnFrancis\LaravelFrancis\resources\views\account\show.blade.php),但它正在我的数据库中更新。我更新了我的帖子。感谢您的宝贵时间!
  • 你没有从 updateEmployee 加载视图到 result 但是,我建议直接重定向到 account.show 路由而不是从 updateEmployee 返回视图。
  • @Francisunoxx 你可以使用return redirect()-&gt;route('account.show');来做到这一点
  • 我的坏处没有注意到我正在返回视图。当我按下按钮时,它显示Missing required parameters for [Route: account.show] [URI: show/{id}]
  • 是的,即使我在点击提交按钮后出现此错误,它仍在数据库中更新。
【解决方案2】:

您的updateEmployee 方法没有使用提供的$id 参数,您只需创建一个新的用户实例并保存它,而是需要检索现有模型并更新它:

$user = User::find($id);// retrieve the existing user
$user->email = $email;
$user->username = $username;

$user->save();// update the record in DB

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 2016-11-19
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多