Schéma a unikátne indexy
Tri Blueprint makrá pokrývajú stĺpce aj jednoduchý index pre reťazcový slug:
$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 takenJazykové mapy a reťazcové slugy, ktoré vylučujú zmazané riadky, potrebujú DDL špecifické pre databázu. Vytvorí ho SlugIndexes — spustite ho po Schema::create():
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 onlyV migrácii
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 (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.
- SQL Server: generovanie a dopyty fungujú; DDL indexov 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 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.