php 无法在Laravel 9中更新Eloquent数据表

dxxyhpgq  于 2023-09-29  发布在  PHP
关注(0)|答案(4)|浏览(117)

我在我的Laravel应用程序中有3个模型,如员工,工资和头衔。具有薪资和职称模型的员工模型一对多关系。现在,我需要使用PSEController updateEmployee函数PSEController更新数据

public function updateEmployee(Request $request, $id) {
    $employee = Employee::find($id);
    $title = $employee->titles()->update($request->all);
    $salary = $employee->salaries()->update($request->all);
    if(is_null($employee)) {
        return response()->json(['message' => 'Employee not found'], 404);
    }
    $employee->update($request->all());
    
    return response($employee, 200);

}

我的API路由是

Route::put('updateEmployee/{id}','App\Http\Controllers\EmployeeController@updateEmployee');

员工模型

public function titles(): HasMany
{
    return $this->hasMany(Title::class, 'emp_no');
}

public function salaries(): HasMany
{
    return $this->hasMany(Salary::class, 'emp_no');
}

薪酬模式

public function employee(): BelongsTo
{
    return $this->belongsTo(Employee::class, 'emp_no');
}

标题模型

public function employee(): BelongsTo
{
    return $this->belongsTo(Employee::class, 'emp_no');
}

但当我尝试更新我得到以下错误消息
TypeError: Illuminate\Database\Eloquent\Builder::update(): Argument #1 ($values) must be of type array, null given, called in F:\2023\code\2023\api\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php on line 23 in file F:\2023\code\2023\api\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php on line 1009
这件事我该怎么办?

cgvd09ve

cgvd09ve1#

该错误表明您没有向API发送任何数据。($request->all()为空)。这是因为您没有验证请求是否包含任何数据。
您可以使用$request->validate()方法验证请求。更多相关信息请参见Laravel文档;
或者你可以使用Laravel表单请求。

dsekswqp

dsekswqp2#

您的数据为空。检查你的路由API。通过数组传入变量。

1bqhqjot

1bqhqjot3#

解决错误

正如一些人在评论中已经注意到的那样,您应该使用$request->all()来获取所有请求参数。但我建议永远不要使用它,并使用表单请求验证来过滤请求。

使用$request->all()以后的错误

您正在更新Has-Many关系,但Eloquent不知道需要更新哪个模型。这是针对职称工资关系的。
我们不知道工资和职称的独立模型背后的逻辑,但它可能只是employees表中的另一列。使用这种方法,您不需要担心更新3个独立的模型,只需检查表单请求中的字段。
如果您需要更新特定的薪资或职称,您可以添加此案例的路由及其各自的控制器功能。

Route::put(
  '/employees/{employee}/salaries/{salary}',
  [EmployeeSalaryController::class, 'update']);
Route::put(
  '/employees/{employee}/titles/{title}',
  [EmployeeTitleController::class, 'update']
);

另一种选择是像我之前说的那样,将这些属性作为雇员的属性,然后使用已经拥有的路由,并在控制器上进行一些修改。

h7wcgrx3

h7wcgrx34#

首先,你要检查员工是否存在,然后像这样更新工资和头衔:

public function updateEmployee(Request $request, $id) 
{
    $employee = Employee::find($id); // When the employee not found its return null value 

    if(!$employee) {
        return response()->json([
            'message' => 'Employee not found'
        ], 404);
    }

    $title = $employee->titles()->update($request->all);
    $salary = $employee->salaries()->update($request->all);
    $employee->update($request->all());
    return response($employee, 200);
}

相关问题