*/ private Builder $builder; /** * @param Builder $builder */ public function __construct(string $disk, string $filename, Builder $builder, int $chunk) { $this->disk = $disk; $this->filename = $filename; $this->chunk = $chunk; $this->builder = $builder; } /** * @param T $model * @return array */ abstract public function mapRow(Model $model): array; public function export(): void { $writer = Writer::createFromPath(Storage::disk($this->disk)->path($this->filename), 'w+'); $writer->insertOne(static::HEADER); $this->builder->chunk($this->chunk, function ($models) use ($writer): void { foreach ($models as $model) { $data = $this->mapRow($model); $row = $this->convertRow($data); $this->validateRow($row); $writer->insertOne(array_values($row)); } }); } /** * @param array $data * @return array */ private function convertRow(array $data): array { $convertedRow = []; foreach ($data as $key => $value) { if ($value instanceof Carbon) { $convertedRow[$key] = $value->toIso8601String(); } elseif ($value === null) { $convertedRow[$key] = ''; } else { $convertedRow[$key] = $value; } } return $convertedRow; } /** * @param array $row * * @throws \Exception */ private function validateRow(array $row): void { if (array_keys($row) !== self::HEADER) { throw new \Exception('Invalid row'); } } }