重载属性Laravel面片的间接修改

重载属性Laravel面片的间接修改,laravel,eloquent,laravel-6,Laravel,Eloquent,Laravel 6,我收到错误500(间接修改重载属性App\Example::$exampleName无效) 关于我的更新方法,我不知道为什么 public function update(Request $request, Example $example) { $data = $request->validate([ 'account_name' => 'required|string', 'name'=> 'nullable|string',

我收到错误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
,因此不允许访问/修改属性或调用方法。我们需要重新思考这里的逻辑。例如:

$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();
在本例中,它首先检查关联记录的存在,如果找到,则忽略初始化。如果找不到,它将初始化它,并通过
示例\u id
链接它(或以何种方式执行链接)。然后,它只需填充列并执行
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->exampleName
return
语句之前可能仍然是
null
,因此会调用一个简单的
$example->load()
,以确保它也会在JSON响应中返回。

这是否回答了您的问题?我尝试了类似的方法,比如在你的url中,但是我得到了相同的错误。你在下面的评论中指出了这一点,但是如果
$example->exampleName
null
,你就不能在上面设置
->name
。当
$example->exampleName
不存在时,您需要在尝试设置属性之前对其进行初始化,并且在尝试访问/修改代码之前,您不应假设代码中存在某些内容。一个简单的
if($example->exampleName){…}
围绕修改应该是可行的。你是对的。但如果不存在,我想创建它。我打开了一些东西,为$example->exampleName编写了updateOrCreate,现在还没有,但我想我已经很接近了。再次,如果
$example->exampleName
null
,您将无法对其调用方法(例如
updateOrCreate()
)。我将在下面发布一个方法。像魅力一样工作!非常感谢。