重载属性Laravel面片的间接修改
我收到错误500(间接修改重载属性App\Example::$exampleName无效) 关于我的更新方法,我不知道为什么重载属性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',
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()
)。我将在下面发布一个方法。像魅力一样工作!非常感谢。