在我们完整地结束这个项目之前,我们还有几篇文章要讲。之后我们将继续讨论更高级的主题。在本文中,我们将解决如何编辑记录。我们需要显示一个表单,其中已经为特定记录填充了所有表单字段,然后当我们单击更新时,我们实际上必须更新我们的记录。
我们的路由
路线已经创建。edit 和 update 路由将分别调用edit
和update
方法。该edit
方法从表中提取记录并将其显示在表单中,然后该update
方法更新记录。
Route::prefix('/personalcars')->group(function() { Route::get('/{id}/edit', [PersonalCarController::class, 'edit']); Route::put('/{id}', [PersonalCarController::class, 'update']); });
编辑链接
为了进入我们的编辑页面,我们需要创建一个编辑按钮(或链接)。在我们的链接旁边index.blade.php
添加一个链接。Edit
Show
我们文件的完整代码index.blade.php
现在如下所示。
@if (session('status'))
{{ session('status') }}
@endif
Year
Make
Model
Exterior Color
Current Value
View
Edit
@foreach($cars as $car)
{{ $car->year }}
{{ $car->brand->name }}
{{ $car->model->name }}
{{ $car->exterior_color }}
{{ $car->current_value }}
Show Car
Edit Car
@endforeach
Add New Car
单击我们的链接Edit Car
将资源发送$id
到.edit
PersonalCarController
编辑方法
我们的edit
方法需要返回一个预填的表格。这很简单。我们已经知道如何获取资源,id
并且我们已经有了一个表单。我们可以而且应该使用create.blade.php
表格。我们只需要复制它并将其存储在edit.blade.php
.
要获取资源,我们将使用PersonalCar::find()
我们用于我们的方法的同一段代码show
。
namespace AppHttpControllers; use AppModelsImage; use AppModelsPersonalCar; use AppModelsPersonalCarBrand; use AppModelsPersonalCarModel; use FakerProviderPerson; use IlluminateHttpRequest; class PersonalCarController extends Controller { // ... /** * Show the form for editing the specified resource. * * @param int $id */ public function edit($id) { $car = PersonalCar::with(['brand', 'model', 'images'])->find($id); // send data to edit view // the view injects the data into the form // the view is returned to the user through the route } // ... }
接下来,我们需要创建我们的edit.blade.php
文件。请记住,我们只会复制我们的create.blade.php
表格。
Add New Car
@if ($errors->any())
@foreach ($errors->all() as $error) {{ $error }}
@endforeach
@endif
在我们更新edit.blade.php
视图之前,我们将传递$car
给它并返回它。
public function edit($id) { $car = PersonalCar::with(['brand', 'model', 'images'])->find($id); return view('personalcars/edit', [ 'title' => "Edit " . $car->year . " " . $car->brand->name . " " . $car->model->name, 'car' => $car, ]); }
编辑.blade.php
让我们对我们的edit.blade.php
文件进行必要的调整。首先,我们需要更改标题。
接下来,我们的表单动作需要指向我们的personalcars/{{ $id }}
路线。
如果你还记得我们的路线,它实际上是在接受一个put
请求。我们无法改变我们的method
目标put
,但我们可以发挥创造力。Blade 有一个@method
指令允许我们传递其他类型的请求,比如put
.
接下来,我们需要填充我们的字段。这是通过利用value
我们每个字段中的属性来完成的。
例如,在我们的year
输入字段中,我们将使用以下代码添加一个值。
我们将对其余字段重复该过程。
Edit Car
@if ($errors->any())
@foreach ($errors->all() as $error) {{ $error }}
@endforeach
@endif
所有标准文本字段都遵循与刚才讨论的相同格式。我们的radio
按钮检查我们的PersonalCar
模型返回了什么。它将返回Automatic
或Manual
。根据哪一个匹配,相应的单选按钮被选中。
我们也可以通过我们的edit
表格添加额外的图片。我们将在此处显示现有图像。
@foreach( $car->images as $image )
@endforeach
Add Another Image
我们的表单现在已完全填充。
更新方法
该update
方法将与我们的store
方法非常相似。唯一的区别是我们将首先访问find
我们的资源并更新它,而不是插入新资源。
我们从相同的验证开始。
/** * Update the specified resource in storage. * * @param IlluminateHttpRequest $request * @param int $id */ public function update(Request $request, $id) { $validated = $request->validate([ 'year' => 'required|integer', 'make' => 'required|max:255', 'model' => 'required|max:255', 'is_manual' => 'required|boolean', 'exterior_color' => 'required|max:255', 'purchase_amount' => 'numeric', 'current_value' => 'numeric', 'sales_amount' => 'numeric|nullable', 'date_purchased' => 'required|date', 'date_sold' => 'date|nullable', 'file' => 'image|mimes:jpg,jpeg,png,gif|max:2048|nullable', ]); }
如果您按原样运行代码,您会看到它已经验证失败。那是因为我们对purchase_amount
,current_value
和的格式化sales_amount
。我们必须去掉非数字字符,比如 $。我们将在preg_replace
这里使用一个简单的表达式。
preg_replace("#[^0-9.]#", "", $car->purchase_amount)
现在这将允许我们通过验证。
接下来,我们需要找到资源。由于$id
已传递给我们的update
方法,我们可以简单地使用它。
public function update(Request $request, $id) { $validated = $request->validate([ 'year' => 'required|integer', 'make' => 'required|max:255', 'model' => 'required|max:255', 'is_manual' => 'required|boolean', 'exterior_color' => 'required|max:255', 'purchase_amount' => 'numeric', 'current_value' => 'numeric', 'sales_amount' => 'numeric|nullable', 'date_purchased' => 'required|date', 'date_sold' => 'date|nullable', 'file' => 'image|mimes:jpg,jpeg,png,gif|max:2048|nullable', ]); $car = PersonalCar::find($id); }
最后,我们需要更新它。
我们将首先添加品牌和型号,或者如果它们存在则检索它们。接下来,我们将更新每个属性并将 和 关联brand
到model
它。最后,如果选择了图片(即 image != null),那么我们将上传图片和attach
它。
应将用户重定向回edit
带有成功消息的页面。
public function update(Request $request, $id) { $validated = $request->validate([ 'year' => 'required|integer', 'make' => 'required|max:255', 'model' => 'required|max:255', 'is_manual' => 'required|boolean', 'exterior_color' => 'required|max:255', 'purchase_amount' => 'numeric', 'current_value' => 'numeric', 'sales_amount' => 'numeric|nullable', 'date_purchased' => 'required|date', 'date_sold' => 'date|nullable', 'file' => 'image|mimes:jpg,jpeg,png,gif|max:2048|nullable', ]); $car = PersonalCar::find($id); $brand = PersonalCarBrand::firstOrCreate([ 'name' => $request->make, ], [ 'slug' => str_replace(" ", "-", strtolower($request->make)) ]); $model = PersonalCarModel::firstOrCreate([ 'name' => $request->model, ], [ 'slug' => str_replace(" ", "-", strtolower($request->model)) ]); $car->year = $request->year; $car->brand()->associate($brand); $car->model()->associate($model); $car->is_manual = $request->is_manual; $car->exterior_color = $request->exterior_color; $car->purchase_amount = $request->purchase_amount; $car->current_value = $request->current_value; $car->sales_amount = $request->sales_amount == 0 ? 0 : $request->sales_amount; $car->date_purchased = $request->date_purchased; $car->date_sold = $request->date_sold; $car->save(); if ( $request->file('file') !== null ) { $image_path = $request->file('file')->store('images', 'public'); $image = Image::create([ 'url' => $image_path, 'alt' => $request->year . " " . $brand->name . " " . $model->name, ]); $car->images()->attach($image); } return redirect()->to('/personalcars/' . $id . '/edit')->with('status', 'Your car has been updated.'); }
我们的成功消息需要能够显示在我们的edit.blade.php
视图中。我们可以在错误检查下添加它。
Edit Car
@if ($errors->any())
@foreach ($errors->all() as $error) {{ $error }}
@endforeach
@endif
@if (session('status'))
{{ session('status') }}
@endif
现在,如果我们进行修改,我们可以单击更新,我们的资源将被更新。
在下一篇文章中,我们将解决删除资源的问题,我们还将着眼于删除特定图像。