2016-01-08 4 views
0

У меня есть модель документа, которая представляет собой документ (имя, описание и т. Д.). Затем у меня есть модель DocumentData, которая представляет данные документа. Документ имеет один для многих DocumentData,Laravel 5 - обновить все данные

Итак, чтобы создать документ, у меня есть форма. Допустим, что у моей формы есть текстовый ввод для владельца документа. В моей таблице 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')); 
} 

Итак, во-первых я получаю документ я работаю, и хранить его в $ документа. Затем я получаю DocumentData для этого документа и сохраняю его в $ docData. $ docData - это коллекция, содержащая мои пары значений ключа для документа.

Затем я зациклирую как $ docData, так и введенные данные, и где совпадают ключи, я возвращаю его обновленное значение.

Однако на данный момент он обновляет все до последнего введенного поля данных. Я не уверен, где еще я могу выполнить операцию обновления, но мне нужно только обновить строку, на которую она ссылается, а не все.

Как я мог это сделать?

Благодаря

+1

Можете ли вы привести нам пример данных, которые вы отправляете, а также структуру данных в пределах $ docData? Трудно точно интерпретировать, как должны устанавливаться данные в каждом месте. В настоящее время вы устанавливаете одинаковые исходные данные для каждого $ orgData в цикле. Скорее всего, поэтому ваше значение всегда является последним, поскольку с каждой итерацией входных данных вы переопределяете ранее установленное значение $ orgData->. – jardis

+0

Несомненно, никаких проблем, я обновил исходное сообщение, которое лучше показывает проблему. –

ответ

3

Я очистил код немного, и сделал несколько изменений реализации. Этот код должен работать, поэтому дайте нам знать, если это не так, и если нет, то что не удалось.

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

Отлично работает :-) Почему вы предлагаете сохранить вместо обновления? –

+0

стр. Я должен ждать 16 часов, чтобы наградить щедростью, но когда смогу, я это сделаю. –

+0

@kate_hudson Рад, что я мог помочь. 'save()' используется, когда вы устанавливаете некоторые значения для объекта и должны сохранять их в базе данных. 'update()' используется, когда вы хотите передать значения для обновления и сохранить их в базе данных. Если вы хотите, вы можете объединить две строки в одну: '$ orgData-> update (['value' => $ input [$ orgData-> key])'. В основном, 'update()' вызывает 'fill()' first, а затем 'save()'. – patricus

Смежные вопросы