70 lines
1.9 KiB
PHP
70 lines
1.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Koneko\VuexyAdmin\Application\Seeding\Concerns\Main;
|
|
|
|
/**
|
|
* ⚡ Trait para soporte de procesamiento por lotes (chunks) en seeders.
|
|
*
|
|
* Permite:
|
|
* - Cargar archivos grandes sin agotar memoria
|
|
* - Delegar la lógica al parser correspondiente (si la soporta)
|
|
* - Integrarse con la barra de progreso
|
|
*
|
|
* Requiere que el parser implemente `parseInChunks()`
|
|
*
|
|
* @package Koneko\VuexyAdmin\Support\Traits\Seeders
|
|
*/
|
|
trait HasSeederChunkSupport
|
|
{
|
|
/**
|
|
* Procesa un archivo usando lotes si el parser lo soporta.
|
|
*
|
|
* @param object $parser Parser con método `parseInChunks()`
|
|
* @param string $path Ruta absoluta del archivo
|
|
* @return void
|
|
*/
|
|
|
|
protected function processInChunks(object $parser, string $path): void
|
|
{
|
|
$this->log("⚡ Procesando por lotes...");
|
|
$this->startProgress();
|
|
|
|
foreach ($parser->parseInChunks($path) as $chunk) {
|
|
foreach ($chunk as $row) {
|
|
$this->processSingleRow($row);
|
|
$this->advanceProgress();
|
|
}
|
|
}
|
|
|
|
$this->finishProgress();
|
|
}
|
|
|
|
/**
|
|
* Procesa una sola fila dentro de un chunk.
|
|
*
|
|
* @param array $row
|
|
* @return void
|
|
*/
|
|
protected function processSingleRow(array $row): void
|
|
{
|
|
try {
|
|
$sanitized = $this->sanitizeRow($row);
|
|
$modelClass = $this->getModelClass();
|
|
$uniqueBy = $this->getUniqueBy();
|
|
|
|
$modelClass::updateOrCreate(
|
|
is_array($uniqueBy)
|
|
? array_intersect_key($sanitized, array_flip($uniqueBy))
|
|
: [$uniqueBy => $sanitized[$uniqueBy] ?? null],
|
|
$sanitized
|
|
);
|
|
|
|
$this->processedCount++;
|
|
} catch (\Exception $e) {
|
|
$this->log("⚠️ Error en fila: " . json_encode($row) . " - " . $e->getMessage());
|
|
}
|
|
}
|
|
}
|