【问题标题】:Laravel 5 - Saved data overwrittenLaravel 5 - 保存的数据被覆盖
【发布时间】:2016-04-18 14:14:04
【问题描述】:

我遇到了数据被覆盖的问题。我有一个文档模型和一个 DocumentData 模型。一个 Document 可以有许多 DocumentData。 所以我有一个数据捕获表单,在我的创建函数中,如果我输出请求,我会得到如下内容

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.如果您正确建立关系,$documentData->documentId = $document->id; 是不必要的;你可以这样做:$documentData->document()->saveMany() - 2. 我推荐reading the Eloquent documentation,因为离你不远。 3.我不建议你循环输入数据和设置属性,更明确会更好。
  • 我不确定我是否正确理解了您的问题,但是您是否尝试创建多个 DocumentData 实例,如果是这样,那么您的处理方式错误。您最终的代码 sn-p 不会在每个上传文件的 db 中创建一个新的 DocumentData 条目,它只会继续写入同一个条目,这就是您只看到最后一个上传文件的原因。您需要在 for 循环中新建一个新实例才能创建多个实例。在任何情况下,您都应该按照 ash 的建议查找关系。

标签: laravel laravel-5 laravel-5.1


【解决方案1】:

为了让事情变得更容易,在你的 Eloquent 模型中设置一些关系。据我了解,Document 可以有多个 DocumentDatas,因此您可以为此设置 一对多 关系,方法是首先在 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
        }
    }

}

注意事项:

  1. 代码中可能有一些错误,因为我没有测试过, 如果是这种情况并且您需要帮助,请发表评论
  2. 如果这个答案对你有用,那就太好了,但可能更多 重要的是要了解为什么您的初始方法没有!你 没有为您上传的每个文件在数据库中创建新条目 加上其他一些小问题。
  3. 熟悉 Eloquent 和人际关系,他们真的 功能强大,即使你能掌握也会让你省去很多头痛 一些基础知识将使您的数据库交互更加简单!

编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2014-08-24
    • 2016-04-13
    • 2020-06-25
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多