Laravel 5更新返回旧关系

时间:2016-10-09 09:34:18

标签: php mysql laravel eloquent

我有一个“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'),新关系会立即返回到当前实例中。

我想知道为什么它不会像创建那样立即返回新关系。

1 个答案:

答案 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'])现在明确仅使用nameage参数。我知道它不是DRY,因为你必须让$fillable->only数组保持同步,但任何对代码不熟悉的人都会知道控制器发生了什么。