در این قسمت از دوره ی آموزش پکیج پرکاربرد و دوست داشتنی Laravel-Excel با یک مثال ساده نحوه فیلتر کردن اطلاعات خروجی توضیح داده میشود.
فرض کنید یک جدول به نام memberships داریم که اطلاعات عضویت اعضا در یک باشگاه ورزشی در آن نگهداری میشود.ستون های جدول به این صورت است:
· first_name
· last_name
· type
· membership_until
در این مثال قصد داریم لیست اعضایی که نزدیک به پایان عضویت آنها در باشگاه هستیم را در یک فایل excel چاپ کنیم به این صورت که تعداد روز های مد نظر را مشخص میکنیم. برای مثال در ورودی عدد 20 را می فرستیم و یک فایل excel ایجاد میشود و اعضایی که 20 روز یا کمتر تا پایان عضویت آنها در باشگاه مانده است ، در این فایل چاپ میشوند.
فایل مدل جدول memberships به این شکل است:
class Membership extends Model
{
protected $table = 'memberships';
public $timestamps = false;
protected $dates = ['membership_until'];
}
با استفاده از دستور زیر یک کلاس export میسازیم:
$ php artisan make:export MembershipsExport
سپس یک route به شکل زیر برای دانلود فایل export میسازیم که تعداد روز های مد نظر با استفاده از query string دریافت میشود:
Route::get('memberships', function () {
$dayCount = request('day_count', 10);
return Excel::download(
new MembershipsExport($dayCount), 'memberships.xlsx');
});
کلاس MembershipsExport به شکل زیر میشود که نکته آن ارسال dayCount به این کلاس است که به کمک آن query ساخته میشود:
<?php
namespace App\Exports;
use App\Membership;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class MembershipsExport implements FromQuery, WithMapping, WithHeadings, WithColumnFormatting, ShouldAutoSize, WithEvents
{
protected $dayCount;
public function __construct(int $dayCount)
{
$this->dayCount = $dayCount;
}
/**
* @return Builder
*/
public function query()
{
$future = now()->addDays($this->dayCount);
return Membership::query()
->whereBetween('membership_until', [now(), $future]);
}
/**
* @return array
*/
public function headings(): array
{
return [
'First Name', 'Last Name', 'Type', 'Membership Until'
];
}
/**
* @param mixed $row
*
* @return array
*/
public function map($membership): array
{
return [
$membership->first_name,
$membership->last_name,
$membership->type,
Date::dateTimeToExcel($membership->membership_until)
];
}
/**
* @return array
*/
public function columnFormats(): array
{
return [
'D' => NumberFormat::FORMAT_DATE_YYYYMMDD,
];
}
/**
* @return array
*/
public function registerEvents(): array
{
$styleArray = [
'font' => [
'bold' => true
],
];
return [
AfterSheet::class =>
function (AfterSheet $event) use ($styleArray) {
$event->sheet
->getStyle('A1:D1')
->applyFromArray($styleArray);
},
];
}
}
در نهایت خروجی به شکل زیر است :