LaravelでCSVからDBにインポート(Insert)するの方法を紹介【サンプルコードあり-2021年7月更新】

このページでは、Laravel環境でCSVをアップロードしDBにインポートするまでの方法をサンプルコード付きで紹介してます。

目次

最終的にできること

結果、できることはこちらです。

  1. WEBページからcsvファイルを選択してアップロードする
  2. CSVの中身をDBのテーブルにinsertする

※csvデータ内のレコードにあるフラグをチェックして削除や更新をさせるなどの応用もできます

テーブル仕様(今回の構成)

今回のサンプルコードは、以下のテーブル構成を前提にして作りました。

テーブル名:users

カラム名 Laravel上でのデータ型 補足
id id 主キー
name string  
email string  
tel string  
address string  
created_at timestamp 登録日時用(デフォルトで現在時刻)
updated_at datetime 更新日時用(デフォルトで現在時刻)

前準備(ライブラリのインストールなど)

今回は「FastExcel」を使用しました。

(GITHUBページ)https://github.com/rap2hpoutre/fast-excel

composer require rap2hpoutre/fast-excel

必要なファイル

以下のファイルを新規作成もしくは編集していきます。

  • config/database.php DB接続用
  • .env DB接続用
  • routes/web.php アクセスするURL定義用
  • app/Http/Controllers/csvController 今回のコントローラ
  • resources/views/csv/index.blade.php 今回のビュー

データベースに接続する方法(database.phpや.env)はネットで調べると色々見つかるので今回は省略します。

routes/web.phpファイル

今回は以下のルートを定義しました。

Route::get('csv', 'App\Http\Controllers\csvImportController@index')->name('csv');
Route::post('csv/upload', 'App\Http\Controllers\csvImportController@upload');

1行目はDBに登録されているデータの一覧表示画面用です。

2行目はファイルアップロード画面用です。

app/Http/Controllers/csvControllerファイル

コントローラの中身は以下のようにしました。(ちょっとコードが見づらいかもです)

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Rap2hpoutre\FastExcel\FastExcel;

class csvImportController extendsController
{


  // 一覧表示処理
  public function index(Request $request){

    $data = DB::table('users')->get(); // データ登録対象のテーブルからデータを取得する
    $count = $request->input('count'); // 何件登録したか結果を返す

    return view('csv.index',['data' => $data,'cnt' => $count]);
  }


  // CSVアップロード〜DBインポート処理
  publicfunction upload(Request $request) {

    // 一旦アップロードされたCSVファイルを受け取り保存する
    $uploaded_file = $request->file('csvdata'); // inputのnameはcsvdataとする 
    $orgName = date('YmdHis') ."_".$request->file('csvdata')->getClientOriginalName();
    $spath = storage_path('app\\');
    $path = $spath.$request->file('csvdata')->storeAs('',$orgName);

    // CSVファイル(エクセルファイルも可)を読み込む
    //$result = (new FastExcel)->importSheets($path); //エクセルファイルをアップロードする時はこちら
    $result = (new FastExcel)->configureCsv(',')->importSheets($path); // カンマ区切りのCSVファイル時

    // DB登録処理
    $count = 0; // 登録件数確認用
    foreach ($result as $row) {
      foreach($row as $item){
        // ここでCSV内データとテーブルのカラムを紐付ける(左側カラム名、右側CSV1行目の項目名)
        $param = [
          'name' => '"'.$item["name"].'"',
          'email' => '"'.$item["tel"].'"',
          'tel' => '"'.$item["tel"].'"',
          'address' => '"'.$item["address"].'"',
        ];
        // 次にDBにinsertする(更新フラグなどに対応するため1行ずつinsertする)
        DB::table('users')->insert($param);
        $count++;
      }
    }
    return redirect(route('csv',['count' => $count]));
  }
}

resources/views/csv/index.blade.phpファイル

ビューファイルは以下のとおりです。

基本的に、一覧とファイルのアップロードフォームを1つのビューにまとめてます。

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>CSVからDBインポートサンプル</title>
</head>

<body>

  <div class="upload">
    <p>DBに追加したいCSVデータを選択してください。</p>
    <form action="/csv/upload/" method="post" enctype="multipart/form-data">
      @csrf
      <input type="file" name="csvdata" />
      <button>送信</button>
    </form>
  </div>

  <div class="contents">
    <p>{{$cnt}}件登録しました。</p>
    <table>
      <tr>
        <th>ID</th>
        <th>name</th>
        <th>address</th>
        <th>tel</th>
        <th>email</th>
        <th>created_at</th>
        <th>updated_at</th>
      </tr>

      <!-- DBから取得したデータを一覧表示する -->
      @foreach ($data as $val)
      <tr>
        <td>{{ $val->id }}</td>
        <td>{{ $val->name }}</td>
        <td>{{ $val->address }}</td>
        <td>{{ $val->tel }}</td>
        <td>{{ $val->email }}</td>
        <td>{{ $val->created_at }}</td>
        <td>{{ $val->updated_at }}</td>
      /tr>
      @endforeach
    </table>
  </div>

</body>
</html>

以上がCSVファイルからDBへのインポートするための方法(サンプルコード)になります。

数ある中の1つの方法として参考まで。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

関連広告

コメント

コメントする

six + sixteen =

目次