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
| RollbackOutcome | Význam |
|---|---|
deleted | Od importu nezmenený a zmazaný — predvolený háčik rollback(). |
handled | Váš háčik rollback() ho vrátil inak (zrušená pozvánka). |
kept | Váš háčik rollback() ho ponechal. |
kept_changed | Od 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. |
missing | Už neexistuje alebo je v koši. |
failed | Zmazanie 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 kryptomienOdoslaní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.