间接修改重载 属性 Laravel 补丁

Indirect modification of overloaded property Laravel Patch

我收到错误 500(间接修改重载 属性 App\Example::$exampleName 无效) 关于我的更新方法,我不确定为什么。

public function update(Request $request, Example $example)
{
    $data = $request->validate([
        'account_name' => 'required|string',
        'name'=> 'nullable|string',
        'name_type' =>'nullable|integer',
    ]);
    $example->account_name = $data['account_name'];
    $example->exampleName->name = $data['name'];
    $example->exampleName->name_type = $data['name_type'];

    $example->push(); 
    return response($example,200);
}

如评论中所述,$example->exampleName 可以是 null,因此 accessing/modifying 属性或调用方法是不允许的。需要重新考虑这里的逻辑。例如:

$exampleName = $example->exampleName;
if(!$exampleName){
  $exampleName = new ExampleName();
  $exampleName->example_id = $example->id;
}
$exampleName->name = $data['name'];
$exampleName->name_type = $data['name_type'];

$exampleName->save();

在此示例中,它首先检查关联记录是否存在,如果找到,则忽略初始化。如果没有找到,它会初始化它,然后 link 通过 example_id 发送它(或者执行 link)。然后,它只是填充列并执行 save() 操作。您的完整代码如下所示:

public function update(Request $request, Example $example){
  $data = $request->validate([
    'account_name' => 'required|string',
    'name'=> 'nullable|string',
    'name_type' =>'nullable|integer',
  ]);

  $example->account_name = $data['account_name'];
  $example->save();

  $exampleName = $example->exampleName;
  if(!$exampleName){
    $exampleName = new ExampleName();
    $exampleName->example_id = $example->id; // Or however you link them
  }
  $exampleName->name = $data['name'];
  $exampleName->name_type = $data['name_type'];

  $exampleName->save();

  $example->load('exampleName');

  return response($example,200);
}

由于 $example->exampleNamereturn 语句之前可能仍然是 null,调用一个简单的 $example->load() 以确保它也在 JSON 中返回响应。