Kontrola poradia migrácií
Štrukturálna kontrola poradia migrácií vyberie cudzie kľúče zo zdrojového kódu migrácií a overí, že každá odkazovaná tabuľka vznikne skôr než migrácia, ktorá na ňu odkazuje:
expect($migrationsDir)->toHaveRunnableMigrationOrder(
?int $foreignKeys = null,
array $tableResolvers = [],
array $externalTables = [],
);it('has a runnable migration order', function (): void {
expect(database_path('migrations'))->toHaveRunnableMigrationOrder(foreignKeys: 19);
});Prečo štrukturálne
SQLite bez námietok vytvorí tabuľku, ktorá odkazuje na neexistujúceho rodiča, a ozve sa až pri vkladaní dát. Prístup „zmigrujme na SQLite a uvidíme“ preto zostane zelený aj pri poradí, ktoré sa na Postgres či MySQL nedá nainštalovať. Päť našich vlastných balíkov takto vyšlo so zelenými SQLite testami. Poradie čítané zo zdrojového kódu robí kontrolu nezávislou od enginu — zlyhá aj na SQLite.
Poradie podľa blokov Schema
Poradie sa sleduje podľa blokov Schema::create() / Schema::table(), nie podľa súborov: súbory bežia v poradí adresára, bloky v rámci súboru v poradí zdrojového kódu. Migrácia, ktorá vytvorí teams a potom team_members (s obmedzením na teams), je spustiteľná; tie isté dva bloky v opačnom poradí nie sú.
Podporované tvary cudzích kľúčov
| Tvar | Rodičovská tabuľka |
|---|---|
->constrained('users'), ->constrained('users', 'id'), ->constrained(table: 'users') | Pomenovaná tabuľka — pozičný aj pomenovaný argument. |
->constrained(), ->constrained(null, 'id'), ->constrained(column: 'uuid') | Odvodí sa zo stĺpca rovnako ako v Laraveli: foreignId('author_id') → authors, foreignUuid('owner_uuid')->constrained(column: 'uuid') → owners. |
->foreignIdFor(Author::class)->constrained() | Vlastné getTable() modelu, preložené cez importy use v súbore — model s vlastným $table sa teda preloží správne. |
->references('id')->on('users') | Tabuľka z on(). |
->constrained($table), Schema::create(Model::table(), …), foreignIdFor($model) | Akýkoľvek neliterál sa mapuje cez tableResolvers; nenamapovaný zlyhá namiesto hádania. |
Schema::table('x') | ALTER musí bežať až po svojom CREATE. |
| Kľúč na vlastnú tabuľku | Zoradí sa so svojou tabuľkou, nie pred ňu. |
Zakomentované deklarácie sa ignorujú.
Preklad neliterálnych názvov tabuliek
Ak migrácia pomenúva tabuľku cez premennú alebo statickú metódu, namapujte surový výraz — presne tak, ako je v zdrojovom kóde — na názov tabuľky:
it('has a runnable migration order', function (): void {
expect(__DIR__.'/../../database/migrations')->toHaveRunnableMigrationOrder(
foreignKeys: 4,
tableResolvers: [
'$tableName' => 'books', // Schema::create($tableName, …)
'PermissionRegistrar::rolesTable()' => 'roles', // ->constrained(PermissionRegistrar::rolesTable())
],
);
});Stráženie strážcu
- Deklarácia, ktorú nemožno rozparsovať, test zhodí namiesto toho, aby ju ticho vynechala: počet rozparsovaných cudzích kľúčov sa musí rovnať volaniam ->constrained( a ->references( v každom súbore, bez komentárov.
- foreignKeys: pripne celkový počet hrán, takže kontrola nikdy neprejde nad prázdnym výsledkom parsovania. Pripnite ho všade, kde aserciu zavediete.
- Chýbajúci adresár migrácií zlyhá, namiesto toho aby prešiel nad ničím.
Tabuľky, ktoré sada nevlastní
Migrácia balíka s obmedzením na tabuľku users hostiteľskej aplikácie či migrácia aplikácie, ktorá mení tabuľku vytvorenú balíkom tretej strany, odkazuje na tabuľku, ktorú žiadny súbor v adresári nevytvára. Deklarujte ju v externalTables:
expect(__DIR__.'/../../database/migrations')->toHaveRunnableMigrationOrder(
foreignKeys: 3,
externalTables: ['users'],
);Každá položka externalTables sa kontroluje proti zastaraniu: musí na ňu odkazovať niektorý kľúč alebo ALTER a sada ju nesmie vytvárať.
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.