Laravel 5 - 更新覆盖所有数据

时间:2016-01-08 14:22:02

标签: php laravel laravel-5 eloquent laravel-5.1

我有一个表示文档的文档模型(名称,描述等)。然后我有一个DocumentData模型,它代表Document的数据。文档具有一对多DocumentData,

所以要创建一个文档我有一个表单。假设我的表单有文档所有者的文本输入。在我的DocumentData表中,标签documentOwner被设置为键,输入的数据被设置为值。因此,对于多个表单元素,我的DocumentData表可能看起来像这样

document_data

 id | documentId | key         |  value      |  
----------------------------------------------
 1  | 1          | clientName  |  Google     |   
----------------------------------------------
 2  | 1          | projectName |  Analytics  |  
----------------------------------------------
 3  | 1          | Contact     |  Mr Sharp   |  
----------------------------------------------
 4  | 1          | startDate   |  29/12/2016 |  
----------------------------------------------

Document表的Document名称和描述是使用Document的视图中的隐藏字段创建的。

所以我可以毫无问题地创建文档。我的更新功能有问题。到目前为止,我有以下

public function update(Request $request, Project $project, $id)
{
    $document = $project->document()->where('id', '=', $id)->first();
    $docData = $document->documentData()->get();

    $input = $request->all();

    foreach($docData as $orgData) {
        foreach($input as $key => $value) {
            if($key !== "filePath" && $key !== "documentType" && $key !== "documentTypeDesc") {
                if($key == $orgData->key) {
                    $orgData->value = $value;
                    $orgData->update();
                }
            }
        }
    }

    return View::make($document->name.'Doc.edit', compact('project', 'document'));
}

首先,我得到我正在处理的文档并将其存储在$ document中。然后我获取此Document的DocumentData并将其存储在$ docData中。 $ docData是一个包含Document的键值对的集合。

然后我循环$ docData和输入的数据以及键匹配的位置,我重置了它的更新值。

但是,此刻,它会将所有内容更新到最后输入的数据字段。我不知道我还能在哪里执行更新操作,但我只需要它来更新它所引用的行,而不是整个事情。

我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:4)

我已经清理了一些代码,并进行了一些实现更改。这段代码应该有效,所以如果没有,请告诉我们,如果没有,请告诉我们失败的原因。

public function update(Request $request, Project $project, $id)
{
    // you can use eager loading and find on the relationship query
    $document = $project->document()->with('documentData')->find($id);
    // you can just access the relationship attribute, no need for the query
    $docData = $document->documentData;

    // gets all input, except the keys specified
    $input = $request->except(['filePath', 'documentType', 'documentTypeDesc']);

    foreach($docData as $orgData) {
        // check if the input has a key that matches the docdata key
        if (array_key_exists($orgData->key, $input)) {
            // update the value
            $orgData->value = $input[$orgData->key];
            // use save, not update
            $orgData->save();
        }
    }

    return View::make($document->name.'Doc.edit', compact('project', 'document'));
}