【问题标题】:Laravel row update, Request methodLaravel 行更新,请求方法
【发布时间】:2017-04-23 19:19:44
【问题描述】:

我正在尝试使用VehicleController 中的此函数更新我的数据库中的一行,但我在输入字段中没有预填充数据:

public function editVehicle(Request $request, Vehicle $vehicle, Customer $customer)
    {

        if ($request->isMethod('post')) {
            $this->validate($request, [
                    'plate' => 'required', //plate is primary key <VARCHAR>
                    'cust_id' => 'required',  //cust_id is foreign key <INTEGER>
                    'type' => 'required',
                    'brand' => 'required',
                    'year' => 'required',
                    'mileage' => 'required'
            ]);

            $this->vehiclesService->editVehicle($request, $vehicle);

            return redirect()->route('Customers:detail', ['customer' => $customer]);
        }

        return view('vehicles.form', ['vehicle' => $vehicle]);

    }

然后我有VehiclesService这个功能的模型:

public function editVehicle($request, $vehicle)
    {
        DB::transaction(function () use ($request, $vehicle) {

            $vehicle->cust_id = $request->cust_id;
            $vehicle->type = $request->type;
            $vehicle->brand = $request->brand;
            $vehicle->year = $request->year;
            $vehicle->mileage = $request->mileage;
            $vehicle->plate= $request->plate;

            DB::update('update vehicles set cust_id=?, type=?, brand=?, year=?, mileage=? where plate=?', 
                    [$vehicle->cust_id, $vehicle->type, $vehicle->brand, $vehicle->year, $vehicle->mileage, $vehicle->plate]);

            Log::info('Vehicle updated.');

            flash('Vehicle successfully updated', 'success');
        });

    }

我用于编辑车辆的表单(例如只有一个输入字段)如下所示:

<label>Plate number</label>
<input type="text" value="@if(isset($vehicle)){{$vehicle->plate}} @endif" name="plate" id="plate" class="form-control" placeholder="Enter plate number, eg. 'PP123KL'">

创建车辆的功能可以正常工作。当我创建车辆时,我使用分配给cust_id(来自表vehicles)的客户id(来自表customers),因此车辆属于给定的客户。这样,cust_id 就是外键。

我对没有任何外键的客户(编辑客户)有类似的功能,它的私钥是id,输入serial integer,这个功能很完美。但是在车辆中,我使用plate,输入varchar 作为私钥,这让我认为Postgresql 可能有问题,因为它没有被称为id,所以这个功能不起作用。表格没有预先填写,即使我尝试在输入字段中输入一些数据并保存编辑,数据也没有保存 - 车辆根本没有被编辑。

无论哪种方式,我都花了几个小时试图修复它,并让我的编辑表单预先填充了给定车辆数据库中的数据,但一点运气都没有。

更新:

路线:

Route::group(['prefix' => '/vehicles'], function () {
        Route::match(['get'],   '/{plate}/edit', 'Vehicles\VehicleController@edit')->name('Vehicles:edit');
        Route::match(['post'],  '/{plate}/editVehicle', 'Vehicles\VehicleController@editVehicle')->name('Vehicles:editVehicle');
}};

车辆控制器:

public function edit(Request $request, $id) {
        $vehicle = Vehicle::with(['customer'])->find($id);
        return view('edit', compact('vehicle'));
    }

public function editVehicle(Request $request, Vehicle $vehicle)
    {
        if ($request->isMethod('post')) {
            $this->validate($request, [
                    'plate' => 'required',
                    'cust_id' => 'required',
                    'type' => 'required',
                    'brand' => 'required',
                    'year' => 'required',
                    'mileage' => 'required'
            ]);

            $this->vehiclesService->editVehicle($request, $vehicle);

            return redirect()->route('Customers:detail', ['customer' => $vehicle->customer]);
        }

        return view('vehicles.form', ['vehicle' => $vehicle]);

    }        

【问题讨论】:

    标签: php postgresql laravel request query-builder


    【解决方案1】:

    我认为您的问题在于控制器中的编辑车辆功能。

    您使用什么网址来选择要编辑的车辆?您的控制器需要一个完整的车辆对象和一个完整的客户对象。在 GET 请求中传递它们实际上是不可能的。

    你真的应该为你的 GET 设置一个单独的控制器:

    public function edit(Request $request, $id) {
      $vehicle = Vehicle::with(['customer'])->find($id);
      return view('edit', compact('vehicle'));
    }
    

    然后,您的视图中就会有一个合适的模型。设置您的视图,以便它使用模型。然后更新您现有的路线以进行编辑,因为您现在将有一个模型可以传递给该控制器。

    您也不需要将 Customer 作为第二个参数传入。完成保存车辆后,您可以使用 $vehicle->customer 进行重定向。

    也不确定为什么要使用 DB 语句来保存。只需使用 $vehicle->save();

    【讨论】:

    • 我使用的是 url http://localhost:8000/vehicles/KK134IL/editVehicle 其中KK134IL 是车牌号
    • 我已经用您提供的代码更新了我的问题,但它给了我一个错误Undefined column: 7 ERROR: column vehicles.id does not exist LINE 1: select * from "vehicles" where "vehicles"."id" = $1 limit 1 ..id 是为了什么?是客户id吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2018-12-20
    • 2016-10-06
    • 2023-01-28
    • 1970-01-01
    • 2023-03-16
    • 2018-03-20
    相关资源
    最近更新 更多