概要
Laravelをwebアプリを作成した際、DBのModelからCSVの形式で落とす方式で、
試行錯誤したのでメモとして残します。
Laracsvについて
Eloquent Modelから簡単にCSVファイルを生成できるライブラリになります。
実際シンプルに実装することができました。
https://github.com/usmanhalalit/laracsv
インストール手順
ライブラリを使う際はあらかじめ以下のコマンドでPJ配下に取り込んでおく必要があります
$ composer require usmanhalalit/laracsv:^2.0
実装
①インスタンスを生成
名前空間の指定は必要ありません
$csvExporter = new \Laracsv\Export();
②DBモデルから情報を取得し、CSVに変換
例としてUserモデルから情報を取得します
App/Http/ModelsにUser.phpのModelを作成済み("name"と"email"のfieldを持ったDB)
// Model Userからデータを取得
$user = User::all();
//CSV変換:第1引数にcollection、第2引数で取得するfieldを指定
$csvExporter->build(Users::get(), ['name', 'email']);
Modelから特定の列を抽出したい場合
例として'name'が'hoge'の列のみを抽出する場合は以下のように書きます
$user = User::where('name','hoge')->get;
headerを変更したい場合
headerをfieldの値でなく、独自に変更したい場合は以下のように指定
$csvExporter->build(Users::get(), ['name' => '名前', 'email' -> 'メール']);
③文字化けを防ぐためBOMの設定
BOMを設定しないと、SJISの文字コードが入っていると文字化けします
$csvReader = $csvExporter->getReader();
$csvReader->setOutputBOM(\League\Csv\Reader::BOM_UTF8);
④CSVをBODYに入れて、responseを返す
Controller等でreturnとして返せば、ブラウザからダウンロードができます
return response((string) $csvReader)
->header('Content-Type', 'text/csv; charset=UTF-8')
->header('Content-Disposition', 'attachment; filename="'.$fileName.'"');