☆Yuus Memo☆
非エンジニアの方でも業務を効率化できるプログラムを紹介します!
Laravel

【Laravel】CSVファイルからデータベースへデータ登録する☆超簡単

皆さんこんにちは!!
以前、LaravelからデータベースのデータをCSVへエクスポートする機能を解説しましたが、今回は逆に、CSVの内容をDBへ保存する部分をやっていきたいと思います。

Laravel-CSV-EXPORT
【Laravel】CSVエクスポート ☆超簡単!!Laravelによる、超簡単なCSVエクスポート機能の作成を解説しています。...

今回は、「Laravel Excel」というパッケージを使用して、CSVファイルをデータベースへ簡単にインポートする方法をご紹介します。
CSVを使ったデータ一括登録にとても便利です!

Laravelのプロジェクトは出来ているものとして解説します。

パッケージのインストール

Laravel Excelの要件は下記の通りです。

  • PHP: ^7.2\|^8.0
  • Laravel: ^5.8
  • PhpSpreadsheet: ^1.15
  • PHP extension php_zip enabled
  • PHP extension php_xml enabled
  • PHP extension php_gd2 enabled
  • PHP extension php_iconv enabled
  • PHP extension php_simplexml enabled
  • PHP extension php_xmlreader enabled
  • PHP extension php_zlib enabled

Composerを使ってパッケージインストールします。

composer require maatwebsite/excel


最後にLaravelvendor:publishコマンドで完了です。

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

これにより、config/excel.phpという名前の新しい構成ファイルが作成されます。

CSVデータを1行ずつ登録

コントローラー側でストレージディレクトリに保存しているCSVデータを1行ずつ読み込んでデータベース登録するという操作を解説したいと思います。。

ストレージディレクトリに保存する方法や、アップロードに関する処理は別途解説記事を書きたいと思います!!

その際、同じものがあれば更新、なければ新規登録を行います。
登録先のテーブル名はproducts(モデル名はProduct)とします。
CSV(products.csv)の内容は商品台帳をインポートすると考えてください。

設定ファイルの変更

CSVファイルのサイズに合わせて、お好みで変更してください。

'settings' => [
    'memoryCacheSize' => '8MB',
    'cacheTime'  => 600
],

文字化けしないように入出力の文字コードを変更する必要があるかもしれません。
デフォルトはUTF-8なので、日本語ならShift-JISかと思います。
私はExcelでUTF-8形式で保存したCSVファイルを使いますのでこのままです。

'encoding' => [
    'input'  => 'UTF-8',
    'output' => 'UTF-8'
],

今回は、CSVのヘッダーとデータベースのフィールド名が一致しない前提で考えているので、次の様にして下さい。

'heading' => 'false',


CSVを1行ずつ読み込む際に、CSVのヘッダ(1行目)をキーとして使わないようにしましょう。
CSVファイルの1行目と登録するテーブルのフィールド名が一致していれば変更の必要はなく、もっと簡単になるので事前に出来る場合は一致させておくと楽ですが、現実、そんなに気を使ったデータは扱わせてもらえないと思います。
ってことで、headingfalseにして1行目を無視します。

Modelにfillableをセットする

上記の通り、CSVの1行目を使いませんので、Productモデルの$fillableにCSVと一致するフィールド名を登録しておきます。

protected $fillable = ['id', 'cd', 'name', 'cost', 'price', 'unit', ];

ControllerでUpsert(一致するデータ)

<?php
namespace AppHttpControllers;

use Illuminate\Http\Request;
use App\Product;
use Excel;

class CsvController extends Controller
{
    public function __construct(Product $product)
    {
        $this->product = $product;
    }

    public function import()
    {
        $fields = $this->product->getFillable();
        $reader = Excel::load(storage_path('csv/products.csv'));
        $rows = $reader->toArray();
        foreach ($rows as $row){
            $id = $row[0];
            $record = $this->post->firstOrNew(['id' => $id]);
            foreach ($row as $key => $value) {
                $colmun = $fields[$key];
                $record->$colmun = $value;
            }
            $record->save();
        }
    }
}

解説

まずは、useLaravel Excelを宣言します。

Excel::load(storage_path('csv/products.csv'));

で/storage/csv/data.csvのCSVを読み込み、

$reader->toArray();

配列に変換し、行数分ループを回します。
firstOrNew()でデータの存在を確認し、なければオブジェクトを生成します。
Postモデルの$fillableの値をキーにセットして、save()で登録します。
今回は差分登録するためにsave()を使ってデータを登録します。
save()関数は、データが存在して変更があるならupdate、存在しなければinsertを自動的に行なってくれます。

まとめ

業務システムに携わる方はCSVを扱う機会が非常に多いと思います。
今回の「Laravel Excel」は非常に扱いやすくドキュメントや解説記事も多いので、皆さんも使い方を覚えておくと良いですよ!!

最後までお読みいただきありがとうございました!!


コメントを残す