以编辑多数据形式上传文件

Upload File in Edit Multiple Data Form

我正在尝试使用 Laravel 8 创建编辑多数据表单 like this。在表单中,您只能为每一行上传一个文件。我可以在不上传文件的情况下更新数据,但是当我尝试更新文件时,它会将我重定向回表单并且没有上传文件。我已经将 enctype 添加到我的表单中。这是我的代码:

查看:

<div class="custom-file" style="margin-left:10px; margin-right:10px;">
   <input type="file" name="bukti[]" class="custom-file-input">
   <label class="custom-file-label"></label>
</div>

控制器:

if($request->file('bukti') !=null) {
  //upload file
  $bukti=array();
  if($files=$request->file('bukti')) {
    foreach($files as $file) {
     $name=$file->getClientOriginalName();
     $path=$file->storeAs('blabla',$name);
     $bukti[]=$name;
  }
}
    
//Update multiple data
if(count($request->id) > 0) {
  foreach($request->id as $item => $v) {
    $data = array(
      'id_laporan' => $laporan_indikators->id,
      'id_pertanyaan' => $request->id_pertanyaan[$item],
      'jumlah' => $request->jumlah[$item],
      'keterangan' => $request->keterangan[$item],
      'bukti' => $bukti[$item],
    );
    $data_laporans = DataLaporan::where('id',$request->id[$item])->first();
    $data_laporans->update($data);
  }
 }

我已经尝试修复它,但仍然没有得到解决方案。请帮助我,因为我还是个初学者。我很抱歉我的英语不好。谢谢。

更新:我已经尝试将代码更新为如下内容:

控制器:

//upload file
if($files=$request->file('bukti')) {
  foreach($files as $file) {
    $name=$file->hashName();
    $path=$file->storeAs('blabla',$name);
    $bukti=$name;
  }
}
    
//Update multiple data
if(count($request->id) > 0) {
   foreach($request->id as $item => $v) {
     $data = array(
       'id_laporan' => $laporan_indikators->id,
       'id_pertanyaan' => $request->id_pertanyaan[$item],
       'jumlah' => $request->jumlah[$item],
       'keterangan' => $request->keterangan[$item],
       'bukti' => $bukti,
     );
     $data_laporans = DataLaporan::where('id',$request->id[$item])->first();
     $data_laporans->update($data);
   }
}

它上传文件并在更新成功后将我重定向回索引页面,但是当我检查数据库时,控制器将所有 bukti 列值更新为相同的文件名。如果我尝试更新两行文件,则所有 bukti 列只是将值更新为上次上传的文件名。我想要的是连续只有一个 jumlah、keterangan 和一个 bukti 文件的数据,因此我可以为每一行设置不同的文件。我真的不知道如何解决这个问题,因为我还是个初学者。感谢您的帮助。

尝试添加双问号(??)检查数组索引是否可用:

<?php

if($request->file('bukti') !=null) {
  //upload file
  $bukti=array();
  if($files=$request->file('bukti')) {
    foreach($files as $file) {
     $name=$file->getClientOriginalName();
     $path=$file->storeAs('blabla',$name);
     $bukti[]=$name;
  }
}
    
//Update multiple data
if(count($request->id) > 0) {
  foreach($request->id as $item => $v) {
    $data = array(
      'id_laporan' => $laporan_indikators->id,
      'id_pertanyaan' => $request->id_pertanyaan[$item],
      'jumlah' => $request->jumlah[$item],
      'keterangan' => $request->keterangan[$item],
      'bukti' => $bukti[$item] ?? '',
    );
    $data_laporans = DataLaporan::where('id',$request->id[$item])->first();
    $data_laporans->update($data);
  }
 }

经过多次尝试,终于找到了解决办法。其实我只需要给出一个文件是否在某行上传的条件即可。

查看:

<div class="custom-file" style="margin-left:10px; margin-right:10px;">
   <input type="file" name="bukti_{{ $data->id }}" class="custom-file-input">
   <label class="custom-file-label"></label>
</div>

控制器:

if (count($request->id) > 0) {
  $bukti = '';
  foreach ($request->id as $item => $v) {
    $id_item = $request->id[$item];
            
    $file = $request->file('bukti_'.$id_item);
    $data = array(
      'id_laporan' => $laporan_indikators->id,
      'id_pertanyaan' => $request->id_pertanyaan[$item],
      'jumlah' => $request->jumlah[$item],
      'keterangan' => $request->keterangan[$item],
                
    );
     //If file is updated
     if ($file) {            
       $name = $file->hashName();
       $path = $file->storeAs('blabla', $name);
       $bukti = $name;
       $data['bukti'] = $name;
     }
     $data_laporans = DataLaporan::where('id', $request->id[$item])->first();
     $data_laporans->update($data);
  }
}