Laravel行更新,请求方法

时间:2017-04-23 19:19:45

标签: php postgresql laravel request query-builder

我正在尝试使用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'">

创造车辆的功能正常。当我创建车辆时,我正在使用分配给id的客户customers(来自表cust_id)(来自表vehicles),因此该车辆属于给定客户。这样,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');
}};

VehicleController:

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]);

    }        

1 个答案:

答案 0 :(得分:0)

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

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

你真的应该有一个单独的GET控制器:

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

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

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

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