【问题标题】:Indirect modification of overloaded property Laravel Patch间接修改重载属性 Laravel Patch
【发布时间】:2020-03-24 04:54:53
【问题描述】:

我收到错误 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);
}

【问题讨论】:

  • 我尝试了类似的东西,比如在你的网址中,但我得到了同样的错误。
  • 你在下面的cmets中已经说过了,但是如果$example->exampleNamenull,你就不能在上面设置->name。当$example->exampleName 不存在时,您需要在尝试设置属性之前对其进行初始化,并且在尝试访问/修改代码之前,您永远不应假设代码中存在某些内容。围绕修改的简单if($example->exampleName){ ... } 应该可以工作。
  • 你说得对。但如果不存在,我想创建它。我在 stackoverflow.com/questions/47713760/… 上找到了一些东西,我为 $example->exampleName 编写了 updateOrCreate,还没有,但我认为我已经接近了。
  • 再一次,如果$example->exampleNamenull,您将无法调用它的方法(例如updateOrCreate())。我将在下面发布一个方法。

标签: laravel eloquent laravel-6


【解决方案1】:

如 cmets 中所述,$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();

在本例中,它首先检查关联记录是否存在,如果找到,则忽略初始化。如果没有找到,它会初始化它,并通过example_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->exampleNamereturn 语句之前可能仍然是null,因此调用一个简单的$example->load() 以确保它也在JSON 响应中返回。

【讨论】:

  • 像魅力一样工作!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多