DevGang
Авторизоваться

Создание быстрой команды экспорта CSV в Laravel

При работе с приложениями Laravel вам может понадобиться экспортировать данные в файл CSV. Независимо от того, создаете ли вы функцию отчетности или просто экспортируете данные для анализа, важно реализовать решение, которое будет и эффективным, и простым.

Вот рекомендуемый подход для создания быстрой команды экспорта CSV в Laravel. Этот метод использует функциональность фрагментации Laravel для изящной обработки больших наборов данных, записывая данные напрямую в выходной поток с помощью функции PHP fputcsv.

Почему именно этот подход?

  • Эффективность: используя фрагментацию Laravel, вы обрабатываете данные меньшими пакетами, сокращая использование памяти.
  • Масштабируемость: вы можете экспортировать большие наборы данных, не сталкиваясь с проблемами памяти.
  • Простота: использование fputcsv гарантирует правильную обработку форматирования CSV без необходимости использования дополнительных библиотек.

Пример кода

use Illuminate\Database\Eloquent\Collection;

$chunk = 500; // Number of records per chunk
$output = fopen('php://stdout', 'wb+'); // Open a stream to StdOut

// Write the CSV headers
fputcsv($output, ['email', 'name']);

// Query the data and write to CSV in chunks
User::select(['email', 'name'])
    ->chunk($chunk, function (Collection $users) use ($output) {
        $users->each(
            fn($user) => fputcsv($output, [$user->email, $user->name])
        );
    });

Разбираем код

1. Определите размер фрагмента

Переменная $chunk определяет, сколько записей обрабатывается в каждой итерации. Отрегулируйте это число в зависимости от размера вашего набора данных и доступности памяти.

$chunk = 500;

2. Открыть поток в StdOut

Используя php://stdout, вы можете писать напрямую в выходной поток. Это особенно полезно для команд, которые генерируют экспорт CSV, так как вывод может быть передан напрямую в файл или другой процесс.

$output = fopen('php://stdout', 'wb+');

3. Напишите заголовки CSV

Перед записью строк данных определите заголовки CSV с помощью fputcsv.

fputcsv($output, ['email', 'name']);

4. Запрос данных по частям

Используйте метод chunk Laravel для обработки данных меньшими партиями. Это предотвращает истощение памяти при работе с большими наборами данных.

User::select(['email', 'name'])
    ->chunk($chunk, function (Collection $users) use ($output) {
        $users->each(
            fn($user) => fputcsv($output, [$user->email, $user->name])
        );
    });

5. Напишите каждую строку

Для каждого пользователя в фрагменте используйте fputcsv форматирование и запись его данных в виде строки CSV.

fn($user) => fputcsv($output, [$user->email, $user->name]);

Вариант использования: команды Artisan

Вы можете инкапсулировать эту функциональность в команду Artisan, что позволит вам выполнить экспорт с помощью одной команды терминала. Вот как вы можете структурировать свою команду Artisan:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Collection;
use App\Models\User;

class ExportUsersToCsv extends Command
{
    protected $signature = 'export:users';
    protected $description = 'Export users to a CSV file';

    public function handle()
    {
        $chunk = 500;
        $output = fopen('php://stdout', 'wb+');

        // Write the CSV headers
        fputcsv($output, ['email', 'name']);

        // Query the data and write to CSV in chunks
        User::select(['email', 'name'])
            ->chunk($chunk, function (Collection $users) use ($output) {
                $users->each(
                    fn($user) => fputcsv($output, [$user->email, $user->name])
                );
            });
    }
}

Заключение

Этот подход к экспорту CSV эффективен, масштабируем и прост в реализации. Используя фрагментацию Laravel и собственный fputcsv, вы гарантируете, что ваше приложение сможет обрабатывать даже большие наборы данных без проблем с производительностью.

Источник:

#PHP #Laravel
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу