BackEnd

Laravel Admin でCSVインポートを実装する

投稿日:

はじめに

こんにちは。カイザーです。今回は、Laravel AdminにCSVインポート機能を追加する方法について、紹介します。

今回は、以下のようなbooksテーブルとBookモデルに対しての、CSVインポート実装を説明します。
なお、booksテーブルのマイグレーションとモデルの作成方法については説明を省略します。

完成形はこのようになります。

下準備

Laravel Adminの導入

Laravel Adminを導入しますが、公式ドキュメント通りなので、細かい説明は省略します。

「app/Admin/routes.php」に対してルーティングを追加するよう指示されるので、指示通りに追記します。

「http://localhost/admin/books」にアクセスし、ログイン後に管理画面が表示されれば準備完了です。
(初期は、ID・パスワード共にadminです。)

Laravel Excelの導入

Laravel Excelは、ExcelやCSVなどといった、スプレッドシートからDBにインポートしたり、逆にエクスポートしたり出来るライブラリです。
モデルと連携しやすいので、簡単にCSVインポートを実装することができます。
Laravel Adminとは全く別のライブラリなので、単体で使用することも可能です。

Laravel Excelの導入はこれで完了です。

Laravel Excelの実装

まず先に、Laravel Excelを使用して、CSVをインポートする機能を実装していきます。
Laravel ExcelではImport系もしくはExport系クラスを作成し、そこにインポートもしくはエクスポートに関する設定を実装していきます。
そして、ExcelクラスのスタティックメソッドにImport/Exportクラスのインスタンスを渡すことで、実際にインポートもしくはエクスポートを行います。
今回はインポート機能を実装するため、まずImportクラスを作成します。

Importクラスの作成

Importクラスは、artisanコマンドから生成できます。

生成された、BooksImportクラスを編集します。
初期状態では、 ToModelが実装されていますが、今回はCSV上のidカラムと、テーブル上のidカラムが一致している場合は更新し、なけければ新規作成する、という形にしたいため、 OnEachRowとした上で、 public function onRow(Row $row)を実装しています。
ToModel では、返却したモデルがLaravel Excel側で自動的にsaveされますが、 OnEachRowでは、保存処理は行われません。
そのため、保存に関わる処理を、開発者側でハンドリングすることができます。

EloquentのupdateOrCreateの使い方は、公式ドキュメントを参照してください。

モデルのfillable化

Laravel Excelと直接関係はありませんが、 updateOrCreate()での複数カラム更新を行うため、モデル側の $fillableを実装する必要があります。
デフォルトで、ハッシュによる意図しないカラムを更新されないように、複数カラムの更新がデフォルトで不可能となっています。そのため、 $fillableを実装する場合も、CSVで更新可能とするカラムのみを指定するようにしましょう。

Laravel Adminの実装

次は、Laravel Admin側の実装です。
Laravel Adminのカスタムツールを使用して、インポートボタンを実装し、Laravel Excelを呼び出して実際にCSVインポートします。

CSVインポートボタンの作成

「app>Admin>Extensions>Tools」に ImportButton.phpを作成します。
(ディレクトリがなければ、作成してください。)

render()で、ツールに表示するインポートボタンのViewを返却します。
また、ツールの動作はjQueryでの実装が推奨されているため、 script()でインポートボタンを押して、CSVファイル選択後にAjaxで送信する処理を実装しています。
この送信先エンドポイントは実装する必要があるため、後で説明します。

render()で返却するViewの、Bladeファイルも必要です。
「resources>views>admin>tools」に import_button.blade.phpというファイル名で作成します。

作成したCSVインポートボタンをツール表示する

「app>Admin>Controllers」のBookControllerクラスを編集します。
管理画面のCRUDのうち、一覧表示に関する設定は grid()で行います。
1番初めのartisanコマンドで、自動生成されているので、そこに追記します。

CSVインポートのエンドポイント作成

最後に、CSVインポートボタンからAjaxでアップロードされるCSVの受け口を作ります。
ここで、アップロードされたCSVを受け取り、Laravel Excelに渡してインポートさせます。
この時、先ほど作成したインポートクラスのインスタンスを使用します。

このエンドポイントにアクセスするためのルーティングをroutes.php追加します。

これで完了です!

さいごに

管理画面を爆速で構築できるLaravel Adminですが、カスタマイズは意外と大変でした。
ちなみに、CSVエクスポートは何もしなくても、Laravel Admin単体で出来ます。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門 初めてのPHP

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

rails

私たちのFactoryGirlとRspecの使用ルール その1

1 はじめに2 そもそもなぜ基本ルールなどを作成しようとしたのか?3 Rspec編3.1 describe、context、itの階層で使用する3.2 10個以上のテストレコードを作成したい場合は、ト ...

rails

【Puma】アプリサーバのチューニング

1 はじめに2 チューニングで注意する項目3 子プロセスの数3.1 最低3つの子プロセスを割り当てる3.2 最大子プロセス数3.3 CPUコア数と子プロセス数3.4 なぜPumaの子プロセス数を増やす ...

Go言語

Golangのファイル操作基本

1 はじめに2 ファイル/ディレクトリの操作2.1 ファイル/ディレクトリの存在を確認2.2 ファイル/ディレクトリの名前変更2.3 ファイル/ディレクトリの削除2.4 ディレクトリ内のファイル確認2 ...

rails

RailsでERBからJavaScriptにhashを渡す方法

1 はじめに2 カスタムデータ属性とは3 実装例3.1 コントローラの実装3.2 ビューの実装3.3 実行結果4 さいごに はじめに 以前、選択したプルダウンメニューに応じて別のプルダウンメニューの内 ...

Laravelの開発環境をdocker-composeで一から構築してみる

1 はじめに2 nginxでwebサーバを立てる2.1 default.conf作成2.2 index.html作成2.3 nginxコンテナ起動3 nginxでPHP-FPMを動作させる3.1 do ...

フォロー

follow us in feedly

blog-page_side_responsive

2019年8月
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。