NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Sluggable for Laravel

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 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():

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

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ázaJazyková mapaReťazec bez zmazaných riadkov
PostgreSQLCREATE 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
SQLiteCREATE UNIQUE INDEX … (json_extract("slug", '$."en"')), v prípade potreby čiastočnýČiastočný unikátny index
MySQL / MariaDBNeviditeľný (INVISIBLE) virtuálny stĺpec slug__en (utf8mb4_bin, NULL pre chýbajúci jazyk / JSON null / zmazaný riadok) + unikátny indexINVISIBLE 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 kryptomien

Odoslaní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.