Laravel Eloquent를 CSV/XLS로 내보내기

11747 단어

Laravel 모델을 CSV 또는 XLS로 내보내기


내가 트위터를 훑어보았을 때, 당신의 웅변 모형을 CSV나 XLS로 쉽게 내보낼 수 있는 방법이 문제가 생겼다.
가능한 방법이 많으니 그중의 몇 가지를 봅시다.

순수한 PHP 사용


네, 알고 있습니다. 이것은 결코 가장 간단한 해결 방안이 아닐 수도 있습니다. 그러나 당신의 도구를 이해하는 것은 항상 좋은 생각입니다. 따라서 우리는 최소한 모델을 어떻게 CSV로 내보내는지 간단하게 이해해야 합니다. 제3자가 의존하지 않아도 됩니다.
PHP에는 데이터 배열을 파일 핸들에 쓸 수 있는 fputcsv이라는 방법이 있습니다.간단합니다.
// Open a file handle in 'write' mode for
// a file called export.csv
$data = [
    [1, 'Marcel', '[email protected]'],
  [2, 'Sebastian', '[email protected]'],
];

$handle = fopen('export.csv', 'w');

foreach ($data as $row) {
    fputcsv($handle, $row);
}

fclose($handle);
이것은 매우 직접적이고 간단한 사용이다.생성된 CSV 파일은 다음과 같습니다.
1,Marcel,[email protected]
2,Sebastian,[email protected]
쉼표 대신 ;을 구분자로 사용하려면 세 번째 매개 변수로 fputcsv 방법에 전달할 수 있다.
위의 예시에서, 우리는 모델 집합이 아닌 정적 데이터 그룹만 사용해서 내보냈다.이런 변화를 하는 것도 쉽다.
$data = User::all();

$handle = fopen('export.csv', 'w');

foreach ($data as $row) {
    fputcsv($handle, $row->toArray(), ';');
}

fclose($handle);
이 예에서는 모든 사용자를 내보내고 $data 변수에 로드한 다음 모델을 순환하여 CSV 파일에 기록합니다.fputcsv는 대상이 아닌 그룹을 전달하기를 원하기 때문에, 우리가 사용하는 방법은 $row->toArray() 방법입니다.
이것은 유용합니다. 다음은 이 CSV 결과입니다.
1;Marcel;[email protected];;2021-04-01T06:37:47.000000Z;2021-04-01T06:37:47.000000Z
2;Sebastian;[email protected];;2021-04-01T06:37:54.000000Z;2021-04-01T06:37:54.000000Z
보시다시피, 우리가 얻은 데이터가 첫 번째 예보다 많습니다. 이것은 우리의 모델이 만든 시간 스탬프와 업데이트된 시간 스탬프 같은 더 많은 정보를 포함하고 있기 때문입니다.위의 CSV 내보내기에서 기본적으로 Laravel과 함께 email_verified_at 열에서 나온 빈 값을 확인할 수 있습니다. 이 예에서는 NULL입니다.
좋아, 순수하고 원시적인 PHP로 이 점을 실현하는 것은 제3자 소프트웨어 패키지를 사용하는 것처럼 화려하지는 않지만, 틀림없이 실행할 수 있을 것이다.그러나 이것도 약간의 결함이 있다.
우리는 모든 모델을 메모리에 불러와야 하기 때문에 (그것들을 $data 변수에 채워야 하기 때문에) users 표의 증가에 따라 대량의 메모리를 사용할 것이다.간단한 해결 방법은 chunk 방법을 사용하는 것이다.이런 방법은 수천 줄을 메모리에 불러오지 않고 웅변 모델의 서브집합만 수신하고 이 모델을 사용하여 클립을 실행하여 대량의 메모리를 절약한다.
블록으로 다시 쓰는 fputcsv 방법은 다음과 같습니다.
$handle = fopen('export.csv', 'w');

User::chunk(100, function ($users) use ($handle) {
    foreach ($users as $row) {
        fputcsv($handle, $row->toArray(), ';');
    }
});

fclose($handle);
우리는 파일 핸들을 만들고 100명의 사용자 중 일부에 대해 핸들에 넣습니다.이렇게 하면 우리는 수천 명의 사용자를 메모리에 불러오지 않을 것이다. 대단하다.

타사 패키지


CSV 또는 Excel로 데이터를 내보낼 수 있는 타사 패키지가 많습니다.Laravel Excel은 현재 가장 유행하는 솔루션입니다.
Laravel Excel을 사용하여 사용자 내보내기를 만드는 방법을 살펴보겠습니다.
먼저 composer를 사용하여 패키지를 설치해야 합니다.
composer require maatwebsite/excel
다음에 우리는 첫 번째 내보내기를 만들 수 있습니다.내보내기는 app/Exports 폴더에 있는 클래스입니다. 내보내는 모든 논리를 포함합니다.
이 패키지에는 다음과 같은 내보내기 클래스를 만드는 데 사용되는 artisan 명령이 포함되어 있습니다.
php artisan make:export UsersExport --model=User
생성된 UsersExport 클래스를 살펴보겠습니다.
namespace App\Exports;

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class UsersExport implements FromCollection
{
    public function collection()
    {
        return User::all();
    }
}
우리가 이 클래스에서 하는 일은 내보낼 데이터를 되돌려 주는 수집 방법을 제공하는 것이다.
디렉터에서 내보내기를 실제로 호출하려면 다음과 같이 하십시오.
namespace App\Http\Controllers;

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

class UsersController extends Controller 
{
    public function export() 
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }
}
우리는 패키지가 제공하는 Excel facade를 사용할 수 있으며, download 방법을 호출하여 패키지가 파일을 다운로드하도록 지시할 수 있다. 마지막으로 가장 중요하지 않은 것은 패키지에 우리가 내보낸 실례와 내보내는 데 필요한 파일 이름을 제공하는 것이다.

하지만 메모리 사용 상황은...


...생각할 수도 있어.만약 우리의 사용자 모델이 수천 줄로 구성된다면, 우리가 User::all()으로 돌아왔기 때문에, 우리는 다시 메모리 문제에 부딪히지 않겠습니까?
네, 그럴게요.우리가 이 문제를 해결합시다.
또한 Laravel Excel에서는 쿼리에서 모델을 내보낸 다음 쿼리에서 블록을 처리할 수 있습니다.UsersExport 클래스는 다음과 같이 수정할 수 있습니다.
namespace App\Exports;

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class UsersExport implements FromCollection
{
    public function query()
    {
        return User::query();
    }
}
이것은 현재 사용자 모델에서 기본 검색어를 되돌려주고 내보낼 뿐입니다.

GUI 솔루션


응용 프로그램에서 CSV/XLS 내보내기를 제공하려면 상술한 모든 해결 방안이 좋습니다. 그러나 때때로 지정한 데이터 집합을 CSV나 XLS로 내보내기만 하면 응용 프로그램에서 이 데이터가 필요하지 않습니다.
예를 들면 다음과 같습니다.
  • SaaS를 실행하고 있으므로 최신 청구서를 내보내려고 합니다. 여러 번 사용할 필요가 없으므로
  • 에 추가할 필요가 없습니다.
  • 당신의 사장이 당신에게 말했다. "헤이, 빨리 CSV 파일을 주세요. 안에 X와 관계가 있는 모든 사용자가 있어요!"
  • 자신/타인을 위한 다른 "일회용"출구
  • 이를 위해서는 GUI 기반 도구를 사용하는 것이 좋습니다.Tinkerwell을 사용하여 CSV 내보내기를 만드는 방법을 보여 드리겠습니다.
    Tinkerwell을 사용하면 로컬 또는 원격 Laravel 어플리케이션에 연결할 수 있으며 타사 패키지를 설치하지 않고도 열려 있는 어플리케이션의 컨텍스트에서 PHP 코드를 평가할 수 있습니다.
    즉, 다음과 같이 fputcsv 코드 세그먼트를 로컬 또는 원격 Laravel 애플리케이션에서 간단히 평가할 수 있습니다.

    이 코드를 직접 작성하는 것 외에 팅커웰의 테이블 모드도 사용할 수 있다.이 모드에서는 PHP 코드로 계산된 컬렉션이나 배열에 대한 테이블 뷰를 제공하고 데이터를 탐색하여 CSV로 내보낼 수 있습니다.

    "CSV 저장"단추를 누르면 시작할 수 있습니다!

    갈수록 화려해지다


    더 쉬운 솔루션을 원하신다면 Invoker을 사용하십시오.Tinkerwell과 마찬가지로 로컬이나 원격 Laravel 프로그램에 연결할 수 있는 데스크톱 프로그램으로 웅변 모델, 메일, 알림 등을 포함한 실시간 관리 패널을 제공합니다.
    Invoker 내부에서 모든 모델을 탐색하고, 설득력 있는 검색을 추가해서 필터를 할 수 있으며, 단추를 누르면 결과를 XLS/CSV로 내보낼 수 있습니다.

    이보다 더 쉬운 것은 없다.
    따라서 우리는 Laravel 모델을 CSV로 어떻게 내보내는지 몇 가지 다른 방법을 연구했다. 순수한 PHP 방법, 제3자 라이브러리를 사용할 수도 있고 GUI 도구를 사용하여 일회성 내보내기와 더욱 간단한 데이터 필터를 할 수도 있다.

    좋은 웹페이지 즐겨찾기