我有一个“belongsTo”关系。
public function relation()
{
return $this->belongsTo('App\Relation', 'relation_id');
}
当我创建实例时,一切都按预期工作。它返回包含关系的新实例。
public function store(Request $request)
{
$instance = $this->model->create($request->all());
return $instance;
}
当我更新“relation_id”时,它返回旧关系。它不会立即返回。
public function findOrFail($id)
{
$link = $this->model
->with('relation')
->findOrFail($id);
return $link;
}
public function update(Request $request, $id)
{
$instance = $this->findOrFail($id);
$instance->update($request->all());
//$instance = $instance ->fresh();
return $instance ;
}
似乎使用 $ instance-> fresh()或删除 - > with('relation'),新关系会立即返回到当前实例中。
我想知道为什么它不会像创建那样立即返回新关系。
答案 0 :(得分:0)
create()
函数返回实例,请参阅API DOC on create()
update()
返回bool
,请参阅API DOC on update()
更新后,需要重新加载关系,如您所述,使用load()或fresh()。
您只更新当前模型/表而不是任何绑定它的关系。
您的模型中很可能缺少(或有错误的)$fillable
数组。这可以保护您免受"大规模分配"漏洞。击>
详细了解文档here中的主题。
击><击>
当用户通过请求传递意外的HTTP参数时,会发生批量分配漏洞,并且该参数会更改数据库中您不期望的列。例如,恶意用户可能会通过HTTP请求发送is_admin参数,然后将其传递到模型的创建方法中,从而允许用户将自己升级为管理员。 击>
提示:
请勿使用$request->all()
,而是使用$request->only(['name', 'age'])
现在明确仅使用name
和age
参数。我知道它不是DRY,因为你必须让$fillable
与->only
数组保持同步,但任何对代码不熟悉的人都会知道控制器发生了什么。