DEV Community

laravel developer
laravel developer

Posted on

100m download csv

public function export(Request $request)
{
$businessId = $request->input('business_id'); // Optional filter

    return Excel::download(new PurchasedNotificationPackagesExport($businessId),'PurchasedPackages.xlsx');
}

public function export()
{
    $response = new StreamedResponse(function () {
        $handle = fopen('php://output', 'w');

        // Header row
        fputcsv($handle, [
            'Business Name',
            'Package Name',
            'Total Push Limit',
            'Push Limit (Left)',
            'Start Datetime',
            'End Datetime',
            'Days (Left)',
            'Price',
            'Status',
        ]);

        // Fetch data in chunks
        PurchasedNotificationPackage::with(['business', 'notification_package'])
            ->selectRaw('*, DATEDIFF(end_datetime, ?) as remaining_days', [Carbon::now()->toDateTimeString()])
            ->when(request('business_id'), fn($q) => $q->where('business_id', request('business_id')))
            ->latest()
            ->chunk(1000, function ($packages) use ($handle) {
                foreach ($packages as $row) {
                    $status = 'Inactive';
                    if (($row->end_datetime && Carbon::parse($row->end_datetime)->isPast()) || $row->push_limit == 0) {
                        $status = 'Expired';
                    } elseif ($row->status == '1') {
                        $status = 'Active';
                    }

                    $start = Carbon::parse($row->start_datetime)->format(config('app.app_datetime_without_seconds_format'));
                    $end = Carbon::parse($row->end_datetime)->format(config('app.app_datetime_without_seconds_format'));

                    fputcsv($handle, [
                        $row->business->name ?? 'N/A',
                        $row->notification_package->name ?? 'N/A',
                        $row->purchased_push_limit == 0 ? '0' : $row->purchased_push_limit,
                        $row->push_limit == 0 ? '0' : $row->push_limit,
                        $start,
                        $end,
                        $row->remaining_days . ' days',
                        $row->price,
                        $status,
                    ]);
                }
            });

        fclose($handle);
    });

    $response->headers->set('Content-Type', 'text/csv');
    $response->headers->set('Content-Disposition', 'attachment; filename="purchased_packages_' . now()->format('Ymd_His') . '.csv"');

    return $response;
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)