Php Laravel 5-更新覆盖所有数据

Php Laravel 5-更新覆盖所有数据,php,laravel,laravel-5,eloquent,laravel-5.1,Php,Laravel,Laravel 5,Eloquent,Laravel 5.1,我有一个表示文档(名称、描述等)的文档模型。然后我有了一个DocumentData模型,它表示文档的数据。文档具有一对多文档数据 所以要创建一个文档,我有一个表单。假设我的表单有一个文档所有者的文本输入。在my DocumentData表中,标签documentOwner设置为键,输入的数据设置为值。因此,对于多个表单元素,我的DocumentData表可能如下所示 document_data id | documentId | key | value | -

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

所以要创建一个文档,我有一个表单。假设我的表单有一个文档所有者的文本输入。在my 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 |  
----------------------------------------------
文档表的文档名称和描述是使用文档视图中的隐藏字段创建的

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

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中。然后,我获取该文档的DocumentData并将其存储在$docData中$docData是一个包含文档的我的键值对的集合

然后我循环$docData和输入的数据,在键匹配的地方,我重置它的更新值

但是,目前,它会将所有内容更新到最后输入的数据字段。我不确定还能在哪里执行更新操作,但我只需要它来更新它所引用的行,而不是全部

我怎么能这样做呢


谢谢

我对代码做了一些清理,并对实现做了一些更改。这段代码应该可以工作,所以如果不能,请告诉我们失败的原因

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'));
}

我对代码做了一些清理,并对实现做了一些更改。这段代码应该可以工作,所以如果不能,请告诉我们失败的原因

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'));
}

您能给我们一个正在发布的数据示例,以及$docData中的数据结构吗?很难准确解释每个位置的数据应该如何设置。目前,您正在为循环中的每个$orgData设置相同的已发布输入数据。这就是为什么您的值总是最后一个值的原因,因为每次迭代输入数据时,您都会覆盖先前设置的$orgData->值。当然,没问题,我已经更新了原始帖子,这更好地说明了问题。您能给我们举一个发布数据的示例,以及$docData中的数据结构吗?很难准确解释每个位置的数据应该如何设置。目前,您正在为循环中的每个$orgData设置相同的已发布输入数据。这就是为什么你的值总是最后一个值的原因,因为每次迭代输入数据时,你都会覆盖先前设置的$orgData->值。当然,没问题,我已经更新了原始帖子,它更好地显示了问题。效果很好:-)你为什么建议保存而不是更新?另外,我要等16个小时才能奖励赏金,“但当我能的时候,我会的。”凯特·哈德森很高兴我能帮上忙<代码>保存()用于在对象上设置一些值并需要将它们保存到数据库中<代码>更新()用于传递值以进行更新并将其保存到数据库中。如果需要,可以将这两行合并为一行:
$orgData->update(['value'=>$input[$orgData->key])
。基本上,
update()
首先调用
fill()
,然后调用
save()
@kate\u hudson save更方便,因为更新本身使用save方法!所以最好调用save来减少工作量!工作非常完美:-)你为什么建议保存而不是更新?另外,我要等16个小时才能奖励赏金,但如果可以的话,我会的。@kate\u hudson很高兴我能帮上忙。
save()
用于在对象上设置一些值并需要将其保存到数据库中时使用。
update()
用于传递值以更新并将其保存到数据库中。如果需要,可以将这两行合并为一行:
$orgData->update(['value'=>$input[$orgData->key])
。基本上,
update()
首先调用
fill()
,然后调用
save()
@kate\u hudson save更方便,因为更新本身使用save方法!所以最好调用save以减少工作量!