Laravel

Laravelで検索結果(postデータ)をexcelで出力する方法

以前の記事「Laravel6でmaatwebsite/excelインストールとエクセル出力方法」ではusersテーブルのデータをそのままgetでエクスポートし、エクセルに出力しましたが今回usersテーブルの検索結果(postデータ)をエクセルで出力する方法をご紹介します。
(Laravelバージョンは6.18.39)

検索を行うusersテーブルを用意

以下のusersテーブルを用意しました。usersテーブルよりname(ユーザー名)カラム内のデータをlike検索します。

usersテーブル

名前 説明
id 主キー
name ユーザー名
email メールアドレス

usersテーブルの内容を全てveiwに出力するclassを作成

usersテーブルの検索結果をveiw(exports/excelusers.blade.php)に出力する以下のclass(/app/Exports/Excelusers.phpファイル)を作成します。

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromView;
use Illuminate\Contracts\View\View;

class Excelusers implements FromView
{

    protected $users;
  
    function __construct($users) {
      $this->users = $users;
    }
  
    public function view(): View
    {
      //下記追加 「excel.xxxxx」の部分はviewまでのrootを記載
      return view('exports.excelusers', [
        'users' => $this->users,
      ]);
    }

}
?>

エクセルファイル出力内容のview(/exports/excelusers.blade.phpファイル)の記述

エクセルファイルに出力する内容のview(/resources/views/exports/excelusers.blade.phpファイル)の記述は以下の通りです。「name」と「email」をエクセルに出力します。

<p>userテーブル</p>
<table>
  <thead>
  <tr>
      <th>Name</th>
      <th>Email</th>
  </tr>
  </thead>
  <tbody>
  @foreach($users as $user)
      <tr>
          <td>{{ $user->name }}</td>
          <td>{{ $user->email }}</td>
      </tr>
  @endforeach
  </tbody>
</table>

エクセルファイル(users.xlsx)を出力するControllerの記述

usersテーブルのname(ユーザー名)カラム検索結果をエクセルファイル(users.xlsx)に出力するController(/app/Http/Controllers/ExcelusersController.phpファイル)の記述は以下の通りです。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

use DB;

use App\Exports\Excelusers;
use Maatwebsite\Excel\Facades\Excel; 


class ExcelusersController extends Controller
{

    //検索結果エクセル出力
    public function excelresult(Request $request)
    {
        $sql = '1=1';

        $username = "";
        if(!empty($request->username)){
            $username = $request->username;
            $sql .= " AND users.name like '%".$username."%'";	//usersテーブルのnameカラムをlike検索
        }
        

        $users = DB::select("SELECT * FROM users WHERE ".$sql." ORDER BY id DESC");

        return Excel::download(new Excelusers($users), 'users.xlsx');
    }

}

エクセル出力URL(/routes/web.php)の記述

エクセル(users.xlsx)出力URL(post)を/routes/web.phpに記述します。

<?php

Route::post('/excelusers', 'ExcelusersController@excelresult');

?>

検索入力画面のview(serchuser.blade.phpファイル)の記述

usersテーブルのnameカラムを検索する入力画面のview(/resources/views/serchuser.blade.phpファイル)の記述は以下の通りです。
(検索入力画面のmodel(class)、Controller、web.phpの記述は省略します)

        <form enctype="multipart/form-data" action="{{ url('excelusers') }}" method="POST" class="form-horizontal">
            @csrf

                <div>エクセルで出力したいusersテーブルに登録されている名前を入力して下さい</div>

                <input type="text" name="username" value="">

                <div>
                    <button type="submit" class="btn btn-primary">
                    検索結果出力
                    </button>
                </div>
        </form>

 
※web.phpに記述した「/usersexport」に入力画面のデータをpostするとusersテーブルnameカラムの検索結果が「users.xlsx」に出力されます。

 
※流用される場合は自己責任でお願いします。