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

Rails5で出力される「alias_method_chain is deprecated.」について

1 はじめに2 alias_method_chainとは3 Module#prependとは4 とりあえず、DEPRECATION WARNINGの出力をなくしたい5 さいごに はじめに 直近のプロジ ...

laravel logo

Laravel-debugerbarを使ってみた

1 はじめに2 インストール3 主な項目3.1 Messages3.2 Timeline3.3 Queries3.4 N+1 Queries3.5 Session3.6 Request4 さいごに5 ...

Kotlinでのnullの基本的な扱いかた

1 はじめに2 基本的にnullを許容しない3 nullを許容するNullable4 Nullableをnon-nullに変える4.1 nullチェックとスマートキャスト4.2 エルビス演算子4.3 ...

laravel logo

Laravelの便利メソッドupsert

1 はじめに2 upsertメソッドとは3 使い方4 タイムスタンプ5 生成SQL6 さいごに7 おすすめ書籍 はじめに LaravelでUPSERTを行いたい場合にupdateOrCreateメソッ ...

laravel logo

Laravelの便利なメールアドレスのバリデーション設定

1 はじめに2 不具合内容2.1 バリデーションルール設定2.2 不正なメールアドレス例3 対応3.1 email:rfc3.2 email:strict3.3 email:dns3.4 email: ...

フォロー

blog-page_side_responsive

2019年8月
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

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