我有一个表示文档的文档模型(名称,描述等)。然后我有一个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和输入的数据以及键匹配的位置,我重置了它的更新值。
但是,此刻,它会将所有内容更新到最后输入的数据字段。我不知道我还能在哪里执行更新操作,但我只需要它来更新它所引用的行,而不是整个事情。
我怎么能这样做?
由于
答案 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'));
}