---
title: "Modely a schéma — Approvals for Laravel | Roundly"
description: "Štyri Eloquent modely, ich tabuľky, relácie a scopes, typ morph kľúča a výmena za vlastné podtriedy."
url: https://roundly-consulting.com/sk/open-source/navody/approvals-for-laravel/modely-a-schema
language: sk
---

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

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

# Modely a schéma

Balík stojí na štyroch modeloch. Každý používa soft deletes, má factory a dá sa vymeniť cez konfiguráciu:

| Konfiguračný kľúč | Model | Tabuľka |
| --- | --- | --- |
| `model` | Approval | approvals |
| `request_model` | ApprovalRequest | approval\_requests |
| `stage_model` | ApprovalRequestStage | approval\_request\_stages |
| `delegation_model` | ApprovalDelegation | approval\_delegations |

## Tabuľky

| Tabuľka | Stĺpce |
| --- | --- |
| `approvals` | id, actor (morph), approvable (morph), status (predvolene approved), reason, approval\_request (nullable morph), decision\_scope, live (nullable), decided\_by (nullable morph), weight (predvolene 1), approval\_request\_stage\_id, decided\_at, expires\_at, timestamps, deleted\_at — unikátny index approvals\_live\_decision\_unique |
| `approval_requests` | id, subject (nullable morph), rule, quorum, required\_approvers, approvers (nullable json), status (predvolene pending), staged (predvolene false), reject\_on\_stage\_rejection (predvolene true), workflow, resolved\_at, expires\_at, timestamps, deleted\_at |
| `approval_request_stages` | id, approval\_request\_id, position, name, rule, quorum, required\_approvers, approvers (nullable json), status (predvolene pending), opened\_at, cleared\_at, timestamps, deleted\_at |
| `approval_delegations` | id, delegator (morph), delegate (morph), starts\_at, ends\_at, revoked\_at, timestamps, deleted\_at |

Stĺpce decision\_scope a live zabezpečujú pravidlo jedného živého rozhodnutia na slot: unikátny index pokrýva schvaľovaný model, aktéra, decision\_scope (žiadosť a stupeň, pri samostatnom rozhodnutí prázdne) a live, ktorý sa zmení na NULL, keď sa rozhodnutie stiahne, nahradí, vyprší alebo mäkko zmaže. V MySQL a PostgreSQL hodnoty NULL v unikátnom indexe nikdy nekolidujú, takže vyradených riadkov môže pribúdať ľubovoľne; SQL Server ich považuje za rovnaké, preto podporovaný nie je. JSON stĺpec approvers uchováva menovaných schvaľovateľov s váhou, ktorú mali pri otvorení — NULL, ak žiadosť či stupeň nikoho nevymenúva.

Zložený index approvals\_actor\_approvable\_status\_index pokrýva actor\_id, actor\_type, approvable\_id a approvable\_type — napriek názvu nie status, ktorý má vlastný index. Do verzie 1.1.0 status obsahoval, čím pri utf8mb4 prekročil limit kľúča MySQL 3072 bajtov; inštalácia, ktorá staršiu migráciu spustila, si ponechá päťstĺpcový index, ktorý slúži tým istým dopytom (pozri Inštalácia).

## Relácie a scopes

- Approval — actor(), approvable(), decidedBy() a approvalRequest() (morph-to) a stage() (belongs-to). Scopes: pending(), approved(), rejected(), expired(), active() (čakajúce alebo schválené), live() (živé rozhodnutie každého slotu), inForce(?$moment) a expiringBefore($moment). Metódy: isInForce(?$moment) a wasDelegated().
- ApprovalRequest — subject() (morph-to), decisions() (morph-many) a stages() (has-many, zoradené podľa position). Metódy: namedApprovers(), approversFor(?$stage), hasNamedApprover($model), currentStage(), resolve(), isOverdue(?$moment), lapseIfOverdue(?$moment) a approvalProgress().
- ApprovalRequestStage — request() (belongs-to) a decisions() (has-many). Metódy: namedApprovers(), hasNamedApprover($model), isOpen() a markOpened().
- ApprovalDelegation — delegator() a delegate() (morph-to). Scopes active(?$moment) a inForceOrScheduled(?$moment); metódy isActiveAt(?$moment) a revoke(?$at).

```php
use RoundlyConsulting\Approvals\Models\Approval;
use RoundlyConsulting\Approvals\Models\ApprovalDelegation;

Approval::query()->approved()->inForce()->whereMorphedTo('approvable', $post)->get();
Approval::query()->live()->whereMorphedTo('actor', $user)->get();   // each slot's live decision
Approval::query()->active()->expiringBefore(now())->get();

ApprovalDelegation::query()->active()->whereMorphedTo('delegate', $assistant)->get();
ApprovalDelegation::query()->inForceOrScheduled()->whereMorphedTo('delegator', $manager)->get();
```

## Typ morph kľúča

key\_type určuje typ siedmich polymorfných id stĺpcov — actor, approvable, approval\_request a decided\_by v approvals, subject v approval\_requests a delegator a delegate v approval\_delegations. Všetky morph ciele musia zdieľať jeden typ kľúča:

| key\_type | Morph id stĺpec | Použite, keď vaše modely… |
| --- | --- | --- |
| `bigint` | bigint | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
| `uuid` | uuid | používajú HasUuids |
| `ulid` | ulid (26 znakov) | používajú HasUlids |

```bash
APPROVALS_KEY_TYPE=uuid   # bigint (default), uuid or ulid — set before you migrate
```

Nenastavená alebo prázdna hodnota sa číta ako bigint; akákoľvek iná vyhodí pri spustení migrácií InvalidConfigurationException, takže preklep nikdy potichu nevytvorí stĺpce bigint pre modely s UUID či ULID kľúčmi. Vlastné id balíka — vrátane approval\_request\_stage\_id — sú vždy autoinkrementálne. Preto na PostgreSQL s uuid zmení migrácia 0007 stĺpec approval\_request\_id na bigint: odkazuje na bigint approval\_requests.id.

Nič nekontroluje, či key\_type sedí k modelom, na ktoré odkazuje, vrátane modelov iného balíka. Jedným z nich je Request z requests-for-laravel: typ jeho id, requests.primary\_key\_type, sa musí rovnať approvals.key\_type. Ani jeden balík túto dvojicu nekontroluje pri štarte či migrácii, takže nesúlad sa prejaví až zlyhaným zápisom — na PostgreSQL zlyhá prvá žiadosť so schvaľovateľmi alebo prvé rozhodnutie (invalid input syntax for type uuid), kým MySQL a SQLite hodnotu uložia bez chyby. Obe nastavte pred migráciou.

## Výmena modelov

Ktorýkoľvek kľúč modelu nasmerujte na vlastnú podtriedu. Balík nakonfigurovanú triedu použije všade — v akciách, traitoch aj reláciách:

```php
// config/approvals.php
'model' => App\Models\Approval::class,
'request_model' => App\Models\ApprovalRequest::class,
'stage_model' => App\Models\ApprovalRequestStage::class,
'delegation_model' => App\Models\ApprovalDelegation::class,
```

```php
namespace App\Models;

use RoundlyConsulting\Approvals\Models\Approval as BaseApproval;

class Approval extends BaseApproval
{
    // your relations, scopes and casts
}
```

Trieda, ktorá nerozširuje očakávaný základný model, vyhodí InvalidApprovalModelException.

## 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/approvals-for-laravel.md)
