2016-04-18 4 views
0

У меня проблема с перезаписи данных. У меня есть модель документа и модель DocumentData. Документ может иметь много DocumentData. Так у меня есть форма ввода данных, и в моем создать функцию, если я вывожу запрос я получаю что-то вроде следующегоLaravel 5 - Сохраненные данные перезаписаны

array:8 [▼ 
    "_token" => "UHTN66xH4ChHpaxWAt4hWYFfpwUyjo6EunLp2iuV" 
    "whatData" => "rgfterter" 
    "whoData" => "tertertertert" 
    "startDate" => "28-04-2016" 
    "deliveryDate" => "30-04-2016" 
    "whyData" => "wefrwerwe" 
    "howData" => "rwerwerwer" 
    "filePath" => array:2 [▼ 
    0 => UploadedFile {#30 ▼ 
     -test: false 
     -originalName: "image.png" 
     -mimeType: "image/png" 
     -size: 788038 
     -error: 0 
    } 
    1 => UploadedFile {#31 ▼ 
     -test: false 
     -originalName: "image2.png" 
     -mimeType: "image/png" 
     -size: 1091127 
     -error: 0 
    } 
    ] 
] 

Что я тогда нужно сделать, это создать документ

$document = new Document(); 
$document->projectId = $project->id; 
$document->name = 'Test Document'; 
$document->save(); 

И затем выполните documentData, используя приведенные выше данные. DocumentData по существу имеет ключ/значение, где ключ - это метка ввода, а значение - введенные данные. На данный момент я делаю это

$documentData = new DocumentData(); 
$documentData->documentId = $document->id; 

foreach ($inputs as $key => $value) { 
    if($key !== '_token' && $key !== 'filePath') { 
     $documentData->key = $key; 
     $documentData->value = $value; 
    } 
    $documentData->save(); 
} 

$fileString = ""; 
if (Input::hasFile('filePath')) { 
    $files = Input::file('filePath'); 

    foreach($files as $file) { 
     $file->move(public_path('uploads'), $file->getClientOriginalName()); 

     $fileString .= public_path('uploads') . '/' . $file->getClientOriginalName(); 
     $documentData->key = 'File Path'; 
     $documentData->value = $fileString; 
     $documentData->save(); 
    } 
} 

Документ создается в порядке, но я только получаю одну строку для DocumentData - последний загруженный путь к файлу. Таким образом, кажется, что другие строки перезаписываются. Как я могу убедиться, что все входы записаны правильно в моей базе данных?

Благодаря

+1

1. '$ documentData-> documentId = $ document-> id;' не требуется, если вы правильно настроили отношения; вы можете сделать: '$ documentData-> document() -> saveMany()' - 2. Я рекомендую [читать документацию «Плохо» (https://laravel.com/docs/master/eloquent-relationships#introduction), потому что вы «Не так далеко. 3.Я не рекомендую вам перебирать входные данные и устанавливать свойства, быть более явным будет лучше. – ash

+1

Я не уверен, что правильно понимаю ваш вопрос, но вы пытаетесь сделать несколько экземпляров 'DocumentData', если так, тогда вы идете по нему не так. Ваш окончательный фрагмент кода не создает новую запись «DocumentData» в db для загружаемого файла, она просто будет записывать одну и ту же запись, поэтому вы видите только последний загруженный файл. Вам нужно создать новый экземпляр в цикле for, чтобы он мог создавать несколько экземпляров. В любом случае вы должны, так как пепел рекомендуется искать отношения. – haakym

ответ

1

Чтобы сделать вещи проще установить некоторые отношения в ваших красноречивых моделях. Как я понимаю, Document может иметь много DocumentData сек, так что вы можете настроить отношения один-ко-многим для этого, во-первых, добавив метод отношения в Document классе:

public function documentData() 
{ 
    // you should include the full namespace here 
    return $this->hasMany(App\DocumentData::class); 
} 

, а затем вы можете настроить другая сторона отношения на DocumentData класса:

public function document() 
{ 
    // again, you should include the full namespace here 
    return $this->belongsTo(App\Document::class); 
} 

Теперь вы можете получить доступ и создать с помощью этих методов отношений!

Я собираюсь переписать (что я предполагаю) действие вашего контроллера здесь с некоторыми настройками, сообщите мне, если вы не следуете.

public function storeDocument(Request $request) 
{ 
    // create new document 
    $document = new Document(); 
    $document->name = 'Test Document'; 
    // you could probably set up a relationship for this too! 
    $document->projectId = $project->id; 
    $document->save(); 

    // grab the uploaded files 
    //we can use this to loop through and create a DataDocument per uploaded file 
    // this assumes uploading a file is required, otherwise it won't work! 
    $uploadedFiles = $request->file('filePath'); 

    // loop through each file 
    foreach($uploadedFiles as $file) { 
     if ($file->isValid()) { 
      // upload file logic 
      $extension = $file->getClientOriginalExtension(); 
      $fileName = uniqid() . '.' . $extension; // give the file a unique name 
      $file->move(public_path() . '/uploads', $fileName); 

      // create our new DocumentData related to our Document 
      // using our documentData() relationship 
      $document->documentData()->create([ 
       'whatData'  => $request->get('whatData'), 
       'whoData'  => $request->get('whoData'), 
       'startDate' => $request->get('startDate'), 
       'deliveryDate' => $request->get('deliveryDate'), 
       'whyData'  => $request->get('whyData'), 
       'howData'  => $request->get('howData'), 
       'filePath'  => public_path() . '/uploads' . $fileName, 
      ]); 

      // finish up! 
      dd($document); 
      // dd() so you can see what you've created, 
      // of course you should probably return redirect here 
     } 
    } 

} 

Things отметить:

  1. Там могут быть некоторые ошибки в коде, как я не проверял, пожалуйста, комментарий, если это так и вам нужна помощь
  2. Если этот ответ работает для вас, это здорово, но может быть больше важно понять, почему ваш первоначальный подход не сделал! Вы не создавали новую запись в вашей БД для каждого загруженного вами файла плюс некоторые другие незначительные проблемы.
  3. Хорошо знаком с Красноречием и отношениями, они действительно мощные и сэкономят вам много головной боли, даже если вы сможете понять, что некоторые из основ сделают ваше взаимодействие с БД намного проще!

Счастливое кодирование!

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