Laravel-admin PHP プログラミング

【Laravel-admin】good/csvを利用したCSVファイルのインポート

こんばんは。

一月に入り一気に寒くなってきましたね。

僕の住んでいる場所は山間にあるため、朝方は超冷えます。そして霧が深いので道路&フロントがガチガチに凍ります。

いいところもいっぱいあるのですが、冬の田舎は苦手ですねぇ…

前置きはさておき、今日はLarave-adminでCSVファイルでのテーブルインポートを行ってみたいと思います。

test_usersテーブルの一覧画面は【Laravel-admin】Laravel-adminで新規テーブルを作成しCRUD画面を追加する方法で作成済みです。

Goodby/CSVのインストール

LaravelでCSVからテーブルにデータをインポートすることができるライブラリはいくつかありますが、今回はメモリ効率が非常にいいという「goodby/csv」を使用したいと思います。

参考:goodby/csv

composerを使用してインストールを行います。

上記の記述を行ったら「composer install」あるいは「composer update」を行います。

updateを行うと他のライブラリなど、新しいバージョンが存在する場合最新版を取得してしまうので、

その場合は「composer.lock」を一度削除してインストールを行います。

実装内容

一覧画面にインポートボタンを追加し、ボタン押下でCSVのデータをテーブルに挿入できるようにしたいと思います。

※一覧に表示されているデータはファクトリーで作成したダミーデータです。

 

インポート用のテーブル作成

インポート用にitemsテーブルを作成します。

マイグレーションファイル

Toolクラスを作成

インポート機能を提供するボタンを一覧画面に追加するためにToolクラスを作成します。

一覧画面のカスタムツールの作成に関しては以下のドキュメントを参考にしました。

ajaxSetupでheader情報にcsrfトークンを追加しないとデータをpost出来ないので忘れず追加しましょう。

参考:Custom tools

app/Admin/Extemsion/Tools/CsvImport.phpを以下の内容で作成します。

CsvImport.php

resource/views配下にビューを作成し、ボタン用のHTMLを記述します。

csv_upload.blade.php

 

Controller

コントローラのgrid内で、作成したToolクラスを読み込みます。

csvImport関数内でgoodby/csvを使用しCSVファイルをパースし、配列に代入後テーブルにインサートしています。

「$interpreter->unstrict();」を記述するすることで、CSVファイルの列の一貫性がない場合も無視して実行します。

CSVファイルの列の一貫性が必要な場合はコメントアウト等すれば、列の一貫性がない場合エラーとなります。

また、LexerConfigでCSVファイルの区切り文字や囲い文字、文字コードなどを指定することができます。

参考:Documentation

TestUserCpntroller.php

まとめ

今回、一覧画面のボタン追加にToolクラスを使用しました。

このToolクラスですが、コントローラで読み込むだけで、表示画面のHTMLにJavascriptを使用して様々な処理を実行できるので使い道はたくさんありそうです!

課題として、CSVのデータはとりあえずはインサートできるようになりましたが、まだまだ改善点は多く、成功時・失敗時のメッセージ表示など調べ切れておりません…

Javascriptを学習しながらUI的に見栄えのいい表示方法が見つかればまた記事にしたいと思います!

-Laravel-admin, PHP, プログラミング

Copyright© Life.log , 2020 All Rights Reserved Powered by AFFINGER5.