---
title: "Hromadné operácie — Sentinel for Laravel | Roundly"
description: "Skenujte, prepečaťte, vytvorte baseline a hromadne aktualizujte všetky riadky modelu — bez tichej legalizácie zmien, všetko alebo nič."
url: https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel/hromadne-operacie
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Sentinel for Laravel](https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel.md)

# Hromadné operácie

Sentinel::model(Invoice::class) vráti handle ModelSeals, ktorý pracuje so všetkými riadkami modelu. Dopyt nad inou triedou modelu sa odmietne (SealingMisconfiguredException::queryModelMismatch).

```php
$seals = Sentinel::model(Invoice::class);

$seals->scan();                                     // ScanReport: counts per status + findings
$seals->scan(where: fn ($query) => $query->where('tenant_id', 7));   // only these rows, chunked
$seals->scan(progress: fn (int $rows) => $bar->setProgress($rows));  // after every chunk
$seals->sealMissing(reason: 'Initial baseline');    // adopt rows that were never sealed
$seals->reseal();                                   // re-seal intact rows with the current key
$seals->reseal(acknowledgeReason: 'INC-90');        // …and acknowledge the others
$seals->resealWhere(fn ($query) => $query->where('status', 'draft'), reason: 'INC-91', actor: $admin);
$seals->updateAndReseal(
    fn ($query) => $query->where('status', 'draft'), ['currency' => 'EUR'], reason: 'FIN-12 currency migration', actor: $admin,
);
$seals->unsealedQuery()->count();                   // rows without a seal row
$seals->seals();                                    // ['financial', 'identity']
```

## Ploché tvary

Ploché tvary berú objekty volieb, ktoré nesú aj to, čo handle nemá — checkSchema pri skene a upgradeFormat pri prepečatení:

```php
use RoundlyConsulting\Sentinel\DataTransferObjects\BaselineOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\ResealOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\ResealWhereRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\ScanOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\UpdateAndResealRequest;

Sentinel::scan(new ScanOptions([Invoice::class], seal: 'financial', limit: 10_000, checkSchema: true));
Sentinel::reseal(new ResealOptions(Invoice::class, onlyOutdated: true));
Sentinel::reseal(new ResealOptions(Invoice::class, upgradeFormat: true));   // rows of an older canonical format
Sentinel::resealWhere(new ResealWhereRequest(Invoice::class, fn ($query) => $query->where('tenant_id', 7), 'INC-91', $admin));
Sentinel::updateAndReseal(new UpdateAndResealRequest(Invoice::class, fn ($query) => $query->where('status', 'draft'), ['currency' => 'EUR'], 'FIN-12', $admin));
Sentinel::sealMissing(new BaselineOptions(Invoice::class, null, 'Initial baseline'));
```

## Prepečatenie nikdy nelegalizuje zmenu

reseal() (aj sentinel:reseal) každý riadok znovu overí pod jeho zámkom a prepečatí len riadky Intact alebo Outdated (udalosť rotated). Riadky už zapečatené aktuálnym kľúčom podľa aktuálnej definície ostanú bez zmeny. Každý iný stav sa preskočí a nahlási — pokiaľ nezadáte dôvod potvrdenia; vtedy sa každý potvrdí so zaznamenaným dôvodom a aktérom. Riadok, ktorý sa nedá zapečatiť, sa započíta ako failed; zamietnutie politikou potvrdenia beh zastaví. ResealReport má resealed, acknowledged, skipped, failed, skippedResults (najviac 1 000) a dryRun.

## Zámerné hromadné aktualizácie

updateAndReseal() najprv v prechode len na čítanie overí každý vybraný riadok — akýkoľvek riadok, ktorý nie je neporušený, vyhodí TamperedModelException::many() a nič sa nezapíše. Potom pre každú dávku (predvolene 500) v jednej transakcii riadky zamkne, pod zámkom ich znovu overí (riadok zmenený medzitým dávku stále odmietne, medzitým zmazaný sa preskočí), spustí update($values) query buildera a každý riadok prepečatí s dôvodom. resealWhere() aj updateAndReseal() prechádzajú vybrané riadky podľa kľúča: orderBy v dopyte sa zahodí (dopyt len filtruje), takže každý vybraný riadok sa spracuje práve raz.

## Baseline

sealMissing() (aj sentinel:seal-missing --reason=…) zapečatí riadky bez riadku pečate a bez histórie v denníku (udalosť baseline, dôvod je povinný). Riadky s históriou, no bez riadku pečate, sa nahlásia ako seal\_deleted a baseline nikdy nedostanú — zmazaná pečať je dôkaz.

where pri skene je closure, ktorá dostane dopyt modelu (bez globálnych scopes, rovnako ako pri celej tabuľke), alebo builder daného modelu; len filtruje, nikdy nemení poradie. reseal() a sealMissing() berú aj callback progress a dlhé príkazy v termináli zobrazia indikátor priebehu.

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel.md)
