【问题标题】:Laravel: import from csv file to database with extra columnsLaravel:从 csv 文件导入到带有额外列的数据库
【发布时间】:2017-12-11 09:48:39
【问题描述】:

我有两个问题,首先我有 csv 文件并想将其导入数据库,第一个问题在数据库中我有 id 列,女巫将自动递增并且不存在于 csv 文件中,并且还有 2 个其他列(名称、作业)在 csv 文件中不存在,但希望它们在数据库中为空,最终用户将填写这些字段 第二个问题是数据库中的日期格式是 yyyy-mm-dd 和 csv 不同。 请注意,我不想修改 csv 文件我希望每件事都在 laravel 上完成,你能帮帮我吗

上传 csv 的控制器

public function store(Request $request)
{
$upload=$request->file('upload-file');
$filePath=$upload->getRealPath();
$file=fopen($filePath,'r');
$header=fgetcsv($file);

$escapedHeader=[];
foreach ($header as $key => $value) {
$header=strtolower($value);

$escapedItem=preg_replace('/[^a-z]/','', $header);
array_push($escapedHeader, $escapedItem);

}
 while($columns=fgetcsv($file))
 {
  if($columns[0]=="")
  {
    continue;
  }
   foreach ($columns as $key => $value) {
   $value=preg_replace('/\D/','', $value);
    }

 $data=array_combine($escapedHeader, $columns);
  $id=$data['id'];
 $details=$data['details'];
 $postingdate=$data['postingdate'];
  $description=$data['description'];
 $amount=$data['amount'];
  $type=$data['type'];
  $slip=$data['slip'];
  $name=$data['name'];
  $job=$data['job'];
  $addchecks=Checks::firstOrNew(['id'=>$id,'details'=>$details]);
  $addchecks->postingdate=$postingdate;
   $addchecks->description=$description;
   $addchecks->amount=$amount;
   $addchecks->type=$type;
   $addchecks->slip=$slip;
   $addchecks->name=$name;
    $addchecks->job=$job;
    $addchecks->save();
     }
     }

【问题讨论】:

    标签: php laravel csv


    【解决方案1】:

    关于第一个问题:
    - 第一个问题是在数据库中,我的 id 列将自动递增,并且不存在于 csv 文件中,并且还有 2 个其他列(名称、作业)在 csv 文件中不存在,但希望它们在数据库中为空并结束用户将填写这些字段。
    让我们把它分成两部分:
    1. 我有 id 列,它将自动递增,并且不存在于 csv 文件中。
    这不是问题,因为数据库通常具有自动递增字段,您可以在插入期间跳过该字段,因此 db 会自行放置 id。
    2. csv 文件中不存在其他 2 列(名称、工作),但希望它们在数据库中为空,最终用户将填写这些字段。
    您可以在 db 中设置此字段 nullable(),这允许您在插入期间跳过字段。
    例如,在您的迁移中:

    //Default table creation/update function
    ....
     $table->string('name')->nullable();
    // If you'd like to specify some other value, you can do it like this
     $table->string('name')->nullbale()->default('some value');
    

    工作领域也是如此。

    关于第二个问题:
    - 第二个问题是数据库中的格式日期是 yyyy-mm-dd,它与 csv 不同
    您可以阅读有关mutators 或内置method 的更多信息,但为了简单起见,您可以将 csv 日期值转换为字符串以重新排列值。例如:

    $postingDate=$data['postingdate'];
    $formattedDate = explode('-', $postingDate);
    // And here you rearrange received values.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多