2016-07-03 12 views
0

私のDB内のレコードを正しく取得し、textfieldに値を出力します。しかし、私のデータベースを更新したいとき、それは動作しません。それはSaveメソッドでDBに既に存在するモデルは更新されません

save()方法はまた、既にデータベースに を存在するモデルを更新するために使用することができる文書で述べています。モデルを更新するには、モデルを取得する必要があります。

だから、私は2つのブレードのテンプレートショー編集を持っています。最初のブレードは、データベースに値が存在することを示します(GET REQUEST)。 2番目のブレードは、ユーザーがデータを更新するための編集フォームを示します。 (POST 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\[email protected]', 
    'as' => 'account.show', 
]); 

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


//UPDATE 
Route::post('/edit/{id}', 
[ 
    'uses' => '\App\Http\Controllers\[email protected]', 
    'as' => 'account.edit', 
]); 
+0

私はlaravelの専門家ではありませんが、問題は、新しいユーザーを作成して名前を入力してから保存しようとしているためだと思うので、laravelはあなたが試みていると思います重複したオブジェクトを保存するには...オブジェクトがすでに存在するかどうかを確認してください。存在する場合はフェッチし、フィールドを変更して保存してください。それ以外の場合はjus新しいものを作成して保存しないでください。 – Polak

+0

私はsave()と同じメソッドを使用して更新することができますが、その前に値を取得する必要があることを伝えるドキュメントをたどりました。 – Francisunoxx

+0

はい、それをフェッチすることで、既に保存されているユーザーIDと他のフィールドを取得しているので、更新されたオブジェクト(データベースの実際の状態を表すオブジェクト)に基づいて変更を行うことができます。 。しかし、私はlaravelに関する経験がないことを覚えています。私はちょうどあなたに日曜日の助けを与えようとしています – Polak

答えて

1

あなたはここに新しいUserを作成しています。

既存のデータを更新するには、まず編集するユーザーデータを読み込む必要があります。あなたは、両方の場合はまた、あなたの検証がここに失敗します($idと仮定すると、ここで、そのユーザーのIDです)

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

$user = new User(); 

を変更することにより、

これを行うと、その問題を解決することができます両方のエントリの一意性をチェックしているため、現在のユーザーにはすでにそのユーザー名または電子メールが割り当てられているため、ユーザー名と電子メールは変更されません。

は、この問題を解決するには、の「指定したidを無視する独自のルールを強制」を参照してください

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

、検証のためにこのようなものを通じてチェックから現在のユーザーを除外する必要がありますここのドキュメント - Validation - unique rule

+0

私は検証で '$ id'を連結できるとは思っていませんでした。最後の質問。ボタンを押すと、未定義の変数:result(View:C:\ Users \ JohnFrancis \ LaravelFrancis \ resources \ views \ account \ show.blade.php)というエラーが表示されます。私は自分の投稿を更新しました。あなたの時間を感謝しました! – Francisunoxx

+1

'updateEmployee'からのビューで' result'をロードしていないのですが、updateEmployeeからビューを返すのではなく 'account.show'ルートにリダイレクトすることをお勧めします。 –

+0

@Francisunoxxあなたは 'return redirect() - > route( 'account.show');' –

0

既存のモデルを取得し、それを更新する必要がある代わりに、あなたのupdateEmployee方法が提供さ$idパラメータを使用していない、とあなただけの新しいユーザーインスタンスを作成し、それを保存します。

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

$user->save();// update the record in DB 
関連する問題