---
title: "Schéma a unikátne indexy — Sluggable for Laravel | Roundly"
description: "Blueprint makrá pre slugové stĺpce a natívne unikátne indexy pre reťazcové aj viacjazyčné slugy v PostgreSQL, MySQL a SQLite."
url: https://roundly-consulting.com/sk/open-source/navody/sluggable-for-laravel/indexy
language: sk
---

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

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

# Schéma a unikátne indexy

Tri Blueprint makrá pokrývajú stĺpce aj jednoduchý index pre reťazcový slug:

```php
$table->slug('slug');                                // string(255)
$table->localizedSlug('slug');                       // jsonb (pgsql) / json (mysql) / text (sqlite)
$table->uniqueSlug('slug', scope: ['clinic_id']);    // string slug, trashed rows count as taken
```

Jazykové mapy a reťazcové slugy, ktoré vylučujú zmazané riadky, potrebujú DDL špecifické pre databázu. Vytvorí ho SlugIndexes — spustite ho po Schema::create():

```php
use RoundlyConsulting\Sluggable\DataTransferObjects\SlugIndexSpec;
use RoundlyConsulting\Sluggable\Schema\SlugIndexes;

// after Schema::create(…):
SlugIndexes::ensure(SlugIndexSpec::localeMap('topics', 'slug', scope: ['shop_id']));
SlugIndexes::ensure(SlugIndexSpec::string('articles', 'slug', includeTrashed: false));
SlugIndexes::forModel(Topic::class);       // specs derived from the definitions (= Slugs::model(Topic::class)->indexes())
SlugIndexes::plan($spec);                  // DDL only
```

## V migrácii

```php
use App\Models\Topic;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use RoundlyConsulting\Sluggable\Schema\SlugIndexes;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('topics', function (Blueprint $table) {
            $table->id();
            $table->json('name');
            $table->localizedSlug('slug');
            $table->timestamps();
        });

        SlugIndexes::forModel(Topic::class);   // one unique index per supported locale
    }
};
```

ensure() aj forModel() prijímajú príznak dryRun a vracajú SlugIndexReport so zoznamom vytvorených a preskočených indexov a príkazmi. Mimo migrácie spustí to isté volanie forModel() aj Slugs::model(Topic::class)->indexes().

## Podľa databázy

| Databáza | Jazyková mapa | Reťazec bez zmazaných riadkov |
| --- | --- | --- |
| PostgreSQL | CREATE UNIQUE INDEX … (("slug"->>'en')) pre každý jazyk, v prípade potreby čiastočný s WHERE deleted\_at IS NULL | Čiastočný unikátny index |
| SQLite | CREATE UNIQUE INDEX … (json\_extract("slug", '$."en"')), v prípade potreby čiastočný | Čiastočný unikátny index |
| MySQL / MariaDB | Neviditeľný (INVISIBLE) virtuálny stĺpec slug\_\_en (varchar podľa maxLength, aspoň 255; utf8mb4\_bin; NULL pre chýbajúci jazyk / JSON null / zmazaný riadok) + unikátny index | INVISIBLE stĺpec slug\_\_live s kolaciou zdroja + unikátny index |

- Indexy sú idempotentné a pomenované {table}\_{column}\[\_{locale}\]\_slug\_unique; názvy dlhšie ako 60 znakov sa skrátia s crc32 hashom.
- Jazyky sa berú z SlugLocales::supported() v čase migrácie; nový jazyk neskôr doplníte cez php artisan sluggable:indexes. Odstránené jazyky si index ponechajú — zmažte ho ručne.
- includeTrashed je na špecifikácii predvolene true — zosúlaďte ho s definíciou alebo použite forModel(), ktorý navyše preskočí definície bez jedinečnosti, s closure rozsahom a naprieč jazykmi.
- MySQL: indexy jazykových máp sú binárne (Café a cafe sú rôzne slugy, rovnako ako pri overení v aplikácii); reťazcové slugové stĺpce si ponechajú vašu kolaciu. Generované stĺpce v MySQL vyhľadávanie nezrýchľujú — slúžia len na vynútenie jedinečnosti.
- MySQL: každý jazykový stĺpec má veľkosť varchar(maxLength), nikdy menej ako 255 — SlugIndexSpec::localeMap() prijíma maxLength: a forModel() ho doplní z definície. Nad 768 znakov (limit kľúča InnoDB 3072 bajtov v utf8mb4) plánovanie vyhodí InvalidSlugDefinitionException (invalidOption), preto pre slugy jazykových máp na MySQL znížte maxLength. Už vytvorený stĺpec sa nezväčší.
- SQL Server nie je podporovaný (podporované sú MySQL a PostgreSQL, SQLite na testy); DDL indexov naň vyhodí UnsupportedDriverException.

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