编辑“Metier”时会创建新的“Metier”

New “Metier” is created when editing a “Metier”

当我尝试编辑 "Metier" 时,会创建一个新的 "Metier" 而旧的保持不变。我想粉碎旧的 "Metier" 并通过编辑创建一个新的。这是我与编辑功能相关的代码。

控制器

 public function edit($id)
{
$metier=Metier::find($id);
return view('metier.edit',['libelle_metier'=>$metier]);
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
 public function update(Request $request, $id)
{
$metier=Metier::find($id);
return view('metier.edit',['libelle_metier'=>$metier]);
}

查看

 <div class="form-group">
 <label for="">libelle Metier </label>
 <input type="text"  name ="libelle_metier" class="form-control"value ="
 {{$libelle_metier->libelle_metier}}" >
 </div>

 <div class="form-group">
 <input type="submit" value = "enregistrer" class="form-control btn btn-
 primary">
 </div>

路线

Route::get('/metier', 'MetierController@index');
Route::get('/metier/create', 'MetierController@create');
Route::post('/metier', 'MetierController@store');
Route::get('/metier/{id}/show', 'MetierController@edit');
Route::get('/metier/{id}/edit', 'MetierController@edit');
Route::upd('/metier/{id}/update', 'MetierController@update');
Route::delete('/metier/{id}', 'MetierController@destroy')

MetierController.php

public function edit($id)
{
$metier=Metier::find($id);
return view('metier.edit',['libelle_metier'=>$metier]);
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    $metier = Metier::find($id);
    $metier->libelle_metier = $request->libelle_metier;
    $metier->save();
    return back();
}

edit.blade.php

@extends('Layouts/app')
@extends('Layouts.master')
@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-10">
            <h1>Modifier Metier </h1>

        <form action=" {{url ('metier')  }}" method="post">
            {{csrf_field()}}



            <div class="form-group">
             <label for="">libelle Metier </label>
             <input type="text"  name ="libelle_metier" class="form-
control"value ="
             {{$libelle_metier->libelle_metier}}" >
             </div>

             <div class="form-group">
             <input type="submit" value = "enregistrer" class="form-control 
btn btn-
             primary">
             </div>
        </form>
    </div>
</div>
@endsection

那是因为您甚至没有尝试更新数据库记录。改为做这样的事情:

public function update(Request $request, $id)
{
    Metier::where('id', $id)->update($request->all());
    return back();
}

或不使用批量分配:

public function update(Request $request, $id)
{
    $metier = Metier::find($id);
    $metier->libelle_metier = $request->libelle_metier;
    $metier->save();
    return back();
}

更新

感谢您分享整个表格。您还使用了 POST 方法而不是 PUT。更改表单 URL 并将此字段添加到表单:

<form action="{{ url('metier/' . $libelle_metier->id . '/update')  }}" method="post">
    {{ method_field('PUT') }}

然后将执行update()方法而不是store()

并将路线更改为 put:

Route::put('/metier/{id}/update', 'MetierController@update');

此外,最好使用 Route::resource 而不是手动创建相同的路由。它将让您避免此类错误。

https://laravel.com/docs/5.6/helpers#method-method-field

{{ method_field('PATCH') }} 添加到您的表单并将操作更改为命名路由并将 metier id 传递给它。

 @extends('Layouts/app')
@extends('Layouts.master')
@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-10">
            <h1>Modifier Metier </h1>

        <form action="{{ route('metier.update', $libelle_metier->id) }}" method="post">
            {{csrf_field()}}
            {{ method_field('PATCH') }}



            <div class="form-group">
             <label for="">libelle Metier </label>
             <input type="text"  name ="libelle_metier" class="form-
control"value ="
             {{$libelle_metier->libelle_metier}}" >
             </div>

             <div class="form-group">
             <input type="submit" value = "enregistrer" class="form-control 
btn btn-
             primary">
             </div>
        </form>
    </div>
</div>
@endsection

路由文件

Route::patch('/metier/{id}/update', 'MetierController@update')->name('metier.update');

提示:删除所有这些

Route::get('/metier', 'MetierController@index');
Route::get('/metier/create', 'MetierController@create');
Route::post('/metier', 'MetierController@store');
Route::get('/metier/{id}/show', 'MetierController@edit');
Route::get('/metier/{id}/edit', 'MetierController@edit');
Route::upd('/metier/{id}/update', 'MetierController@update');
Route::delete('/metier/{id}', 'MetierController@destroy')

并且要么将其全部添加为单个资源,以便一次添加所有 REST url。 这就是它的 REST 规范应该如何。阅读 REST Resource Naming Guide and here

Route::resource('metier', 'MetierController');

或以这种方式添加而不是资源

Route::get('/metier', 'MetierController@index')->name('metier.index');
Route::get('/metier/create', 'MetierController@create')->name('metier.create');
Route::post('/metier', 'MetierController@store')->name('metier.store');
Route::get('/metier/{id}', 'MetierController@show')->name('metier.show');
Route::get('/metier/{id}/edit', 'MetierController@edit')->name('metier.edit');
Route::patch('/metier/{id}', 'MetierController@update')->name('metier.update');
Route::delete('/metier/{id}', 'MetierController@destroy')->name('metier.destroy');

了解 Resource Controllers

控制器

public function edit($id)
{
    $metier=Metier::find($id);
    return view('metier.edit',['libelle_metier'=>$metier]);
}

public function update(Request $request, $id)
{
    // do some request validation
    $metier=Metier::find($id);
    $metier->update($request->all());
    return redirect()->route('metier.show', $metier->id);
}

如果您遇到质量分配错误。

protected $guarded = []; 添加到 Metier 模型