Laravel 8 update



我实际上用Laravel 8做了一个项目。插入工作正常,但不能更新。我希望它可以更新我的轨道。

My controller:

public function updateTrack(Request $request, Tracks $track)
{
$request->validate([
'name' => 'required|string|min:3|max:255',
'author' => 'required|string|min:3|max:255',
'level' => 'required',
'type_track' => 'required',
]);
$track->update($request->all());
return redirect()->route('AfterTrackUpdate', compact('track'))
->with('success','Track updated successfully');
}

我的观点:

@extends('template.header')
<main class="page contact-page">
<section class="portfolio-block contact">
<div class="container">
<div class="heading">
</div>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>
{{ $error }}
</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ route('AfterTrackUpdate', $track->id_track) }}" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="form-group">
<label for="name">Nom</label>
<input class="form-control item" type="text" id="name" name="name" value="{{ $track->name }}">
</div>
<div class="form-group">
<label for="author">Auteur</label>
<input class="form-control item" type="text" id="author" name="author" value="{{ $track->author }}">
</div>
<div class="form-group">
<label for="level">Niveau</label>
<select class="form-control item" type="text" id="level" name="level">
@foreach($levels as $l)
@if($track->level == $l->id_level)
<option value="{{ $l->id_level }}" selected>{{ $l->name }}</option>
@else
<option value="{{ $l->id_level }}">{{ $l->name }}</option>
@endif
@endforeach
</select>
</div>
<div class="form-group">
<label for="type_track">Type</label>
<select class="form-control item" type="text" id="type_track" name="type_track">
@foreach($tracksType as $tr)
@if($track->type_track == $tr->id_track_type)
<option value="{{ $tr->id_track_type }}" selected>{{ $tr->name }}</option>
@else
<option value="{{ $tr->id_track_type }}">{{ $tr->name }}</option>
@endif
@endforeach
</select>
</div>
<button type="submit" class="btn btn-primary" value="Update">Modifier</button>
</form>
</div>
</section>
</main>

My Class:

class Tracks extends Model
{
use HasFactory;
/**
* Table associée au model.
*
* @var string
*
*/
protected $table = 'tracks';
/**
* Clé primaire de la table.
*
* @var integer
*/
protected $primaryKey = 'id_track';
/**
* Indique si la clé primaire est en auto-incrément.
*
* @var bool
*/
public $incrementing = true;
/**
* Indique si le modèle utilise les timestamps.
*
* @var bool
*/
public $timestamps = true;
protected $fillable = [
'type_track',
'name',
'author',
'level'
];
}

dd($请求→所有()):

array:7 [▼
"_token" => "HQkkCUjflzRNbMnzmlSNONGExc8Yua8fj0UE4q9g"
"_method" => "PUT"
"name" => "Braking"
"author" => "RedLynx"
"level" => "1"
"type_track" => "1"
1 => null
]

My route:

Route::put('/', [TracksController::class, 'updateTrack'])->name('AfterTrackUpdate');

我被重定向到我的页面,但我的轨道不再更新了。如果有人能帮助我,请与laravel 8更新我将不胜感激,谢谢。

您正在尝试update一个不存在的Tracks实例,因为您的路由缺少{tracks}路由参数:

Route::put('/', [TracksController::class, 'updateTrack'])->name('AfterTrackUpdate');

注意到您的控制器方法如何将Tracks $track作为public function updateTrack()的第二个参数?它从来没有被你的前端传递/解析过,所以它创建了一个新的Tracks实例,你不能在它上面调用->update(),因为它缺少一个主键。

如果你在Route中添加了Route- model Binding,你的代码应该可以工作了:

Route::put('/{tracks}', [TracksController::class, 'updateTrack'])->name('AfterTrackUpdate');

编辑:如果验证失败,它将重定向到/{tracks}作为GET请求。因为你没有这个定义,使用手动验证器:

$validator = Validator::make($request->input(), [
'name' => 'required|string|min:3|max:255',
'author' => 'required|string|min:3|max:255',
'level' => 'required',
'type_track' => 'required',
]);
if ($validator->fails()) {
return back()->withErrors($validator);
}
... // Rest of your Update Logic

只要确保在TracksController的顶部包含use Validator;,以避免命名空间问题。

最新更新