NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Imports for Laravel

Vrátenie importu

$batch->canRollback();            // completed / failed / cancelled, before undo_until, no rollback yet (or a failed one)
$batch->rollback();
$batch->rollbackReport();         // RollbackReport (null while a queued rollback runs)

V rámci imports.undo.window (P7D) a po authorize(Rollback) sa spracujú riadky evidencie označené ako created, ktoré ešte neboli vrátené — priamo do preview.sync_threshold, inak ako job batch — každý záznam vo vlastnej transakcii:

  • Záznam sa načíta cez scope vlastníka vrátane soft-deleted, so zámkom riadka — úprava medzi kontrolou a zmazaním počká a potom sa prejaví. Neexistuje alebo je v koši → missing.
  • Bez uloženého kontrolného súčtu → kept_changed s dôvodom no_checksum: nič nedokazuje, že sa nezmenil. Stane sa to, keď import nedokázal vytvorený záznam spätne načítať cez dopyt vlastníka (ownership() a create() si odporujú) — import to nahlási.
  • Zmenený od importu → kept_changed: podľa kontrolného súčtu (predvolene — nové načítanie surových atribútov bez kľúča a časových pečiatok, takže samotné touch() nie je zmena, ale tichý hromadný update áno) alebo podľa updated_at (ChangeDetection::updatedAt()).
  • Inak váš háčik rollback(): Deleted (predvolené), Handled alebo Kept.
  • Zmazanie, ktoré vyhodí výnimku (cudzí kľúč vo vašej schéme) → failed s dôvodom; ostatné pokračujú.

Aktualizácie sa nikdy nevracajú a prepojené (linked) záznamy sa nikdy nemenia. Evidencia zaznamená každý výsledok v tej istej transakcii, takže opakované vrátenie nič neurobí dvakrát a druhé vrátenie nemá žiadny účinok. Vrátenie, ktoré skončilo stavom rollback_failed, spustí ImportRollbackFailed a kým je okno otvorené, dá sa spustiť znova — už vrátené riadky sa preskočia.

Každá časť vrátenia sa ráta ako priebeh, takže imports:sweep nikdy nevzdá dlhé vrátenie, ktoré stále postupuje. Job batch vrátenia pripúšťa zlyhania: jedna zlyhaná časť vrátenie neukončí, kým ostatné časti ešte bežia — skončí stavom rollback_failed (chunk_failed), keď sa dávka dokončí.

Výsledky

RollbackOutcomeVýznam
deletedOd importu nezmenený a zmazaný — predvolený háčik rollback().
handledVáš háčik rollback() ho vrátil inak (zrušená pozvánka).
keptVáš háčik rollback() ho ponechal.
kept_changedOd importu zmenený — podľa kontrolného súčtu alebo updated_at — alebo bez uloženého súčtu (dôvod no_checksum): ponechaný a uvedený v zozname.
missingUž neexistuje alebo je v koši.
failedZmazanie vyhodilo výnimku (cudzí kľúč aplikácie) — dôvod sa uloží, ostatné pokračujú.

Report vrátenia

$report = $batch->rollbackReport();

$report->deleted; $report->handled; $report->keptChanged; $report->keptByHook;
$report->linked; $report->missing; $report->failed;
$report->keptTotal();
foreach ($report->kept as $view) {   // ImportedRecordView
    $view->rowNumber; $view->record; $view->action; $view->rollbackOutcome; $view->rollbackReason;
}

Vlastné vrátenie

Ak chcete záznam vrátiť inak — zrušiť namiesto zmazania — prepíšte na importéri rollback():

use RoundlyConsulting\Imports\Enums\RollbackOutcome;

public function rollback(Model $record, ImportContext $context): RollbackOutcome
{
    if ($record->accepted_at !== null) {
        return RollbackOutcome::Kept;      // leave it alone
    }

    $record->revoke();                     // undone another way

    return RollbackOutcome::Handled;       // the default deletes it: RollbackOutcome::Deleted
}

Rozpoznanie zmien

Observer modelu, ktorý záznam upraví hneď po importe, spôsobí, že záznam vyzerá zmenený. Takéto atribúty vynechajte v checksumAttributes(), porovnávané atribúty uveďte cez ChangeDetection::checksum([...]) alebo prejdite na ChangeDetection::updatedAt():

public function checksumAttributes(Model $record): array
{
    // an observer stamps last_synced_at right after the import — ignore it
    return Arr::except($record->getAttributes(), ['id', 'created_at', 'updated_at', 'last_synced_at']);
}

Po uplynutí okna rollback() vyhodí UndoWindowClosedException (409).

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.