大量データの投入にはかなりの労力を伴いますよね
特にテスト用のデータとか、同じようなデータを繰り返し入力するのは地獄です
Excelでパッと作成して、パッと取り込みたい!
LaravelでExcelの取り込みをやるにはどうやるかを書きます
今回使用するのは Laravel-Excelというものです
https://laravel-excel.com/
それでは、順を追って説明していきます。
Laravel Excelをインストール
composerでインストールできるように
composer.json 内の require へ「”maatwebsite/excel”: “^3.1” 」を追加します。
[
"name": "laravel/laravel",
"type": "project",
"require": {
"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.7.*",
"laravel/tinker": "^1.0",
"maatwebsite/excel": "^3.1"
},
]
コマンドプロンプトでプロジェクトフォルダまで移動したら
[ composer update ]を実行します。これでインストールはクリアです。
Laravel Excelの有効化
次に、app.phpを編集します。
app.phpへの記載順序は特に気にしなくても良さそうですが、
一番下に追記しましょう。
providers , aliases に対して、下記2行を追加します。
<?php
return [
'providers' => [
…
Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
…
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],
];
?>
これでLaravel Excelが Facadesとして使えるようになりました。
次はExcelデータを取り込む為のModelを作成します。
Model作成
artisanコマンドでモデルを生成してしまいましょう。
> php artisan make:import UsersImport --model=User
作成されたapp\Imports\UsersImport.phpを編集します。
今回は、Laravelで自動生成できるusersテーブルを使ってみます。
<?php
namespace App\Imports;
use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class UsersImport implements ToModel, WithHeadingRow
{
public function model(array $row)
{
return new User([
'id'=>$row['id'],
'name'=>$row['name'],
'email'=>$row['email'],
'email_verified_at'=>$row['email_verified_at'],
'password'=>$row['password'],
'remember_token'=>$row['remember_token'],
'created_at'=>$row['created_at'],
'updated_at'=>$row['updated_at'],
]);
}
public function headingRow() : int
{
return 1;
}
}
?>
$rowの役割
$rowは文字通り、行データを格納する変数です。
この$rowで保持している各列のデータを、Userモデルの各プロパティにマッピングさせます。
マッピング方法は$row[‘id’]のようにカギカッコの中の文字列で指定します。
このカギカッコ内の文字列はインポートデータのヘッダ行の定義と一致します。
インポートするファイルは下表のような形です。
id | name | email_verified_at | password | … | |
1 | taro | taro@test.com | null | ******** | … |
2 | hana | hana@test.com | null | ******* | … |
ヘッダ行の認識
WithHeadingRowによって、ヘッダを認識することができるようになります。
これを使わなければ、ヘッダも通常レコードとしてインポートされるようになります。
headingRowという関数によって、取り込むファイルのヘッダ行がどこにあるかを定義できます。取り込むファイルのヘッダ行が2行目にあれば、return 2;とすればOKです。
Controllerを準備
先程作成したModelをControllerで使用します。Controllerでは画面からPostされたファイル情報をModelに引き渡すような実装になります。
<?php
namespace App\Http\Controller;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class TestController extends Controller
{
function postData(Request $request)
{
Excel::Import(new UsersImport, $request->updateFile);
return view('next');
}
}
?>
HTMLを準備
準備はあと少しです。インポート対象をPostするだけです。ファイルをアップロードする為のタグをform内に設けます。
<form action="next" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
<button>Submit</button>
</form>
ここでポイントとなるのはformタグの属性としてenctypeを指定する点です。これを忘れていると、Controller側でアップロードしたファイルの名前しか取得できません。
最後に
如何でしたでしょうか。
今回はポイントをかいつまんで説明しましたが、簡単にエクセルのデータを直接DBに書き込む事ができたと思います。Javaでこれをやると結構時間と手間がかかるイメージですが、Laravel Excelだと慣れればあっという間に実装できますね。