このページでは、Laravel環境でCSVをアップロードしDBにインポートするまでの方法をサンプルコード付きで紹介してます。
目次
最終的にできること
結果、できることはこちらです。
- WEBページからcsvファイルを選択してアップロードする
- CSVの中身をDBのテーブルにinsertする
※csvデータ内のレコードにあるフラグをチェックして削除や更新をさせるなどの応用もできます
テーブル仕様(今回の構成)
今回のサンプルコードは、以下のテーブル構成を前提にして作りました。
テーブル名:users
カラム名 | Laravel上でのデータ型 | 補足 |
---|---|---|
id | id | 主キー |
name | string | |
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つの方法として参考まで。
コメント