---
title: "Databázová schéma a typy kľúčov — Likes for Laravel | Roundly"
description: "Jediná polymorfná tabuľka likes, soft deletes, typy kľúčov UUID/ULID a nahradenie modelu Like vlastným."
url: https://roundly-consulting.com/sk/open-source/navody/likes-for-laravel/databazova-schema
language: sk
---

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

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

# Databázová schéma a typy kľúčov

Jediná polymorfná tabuľka eviduje, komu sa čo páči. Jej názov určuje likes.table; stĺpce sú pevné:

| Stĺpec | Typ | Poznámka |
| --- | --- | --- |
| `id` | autoinkrement | Vždy autoinkrementálny kľúč bez ohľadu na key\_type. |
| `actor_type, actor_id` | polymorfná dvojica (unikátny kľúč) | Model, ktorý páčik dal. Typ actor\_id určuje key\_type. |
| `likeable_type, likeable_id` | polymorfná dvojica (unikátny kľúč) | Model, ktorý páčik dostal. Typ likeable\_id určuje key\_type. |
| `type` | string(64), predvolene like | Typ reakcie — najviac 64 znakov, aby sa unikátny kľúč na MySQL a MariaDB zmestil do limitu indexu InnoDB. |
| `created_at, updated_at` | timestamps | Podľa created\_at sa počíta okno trendov. |
| `deleted_at` | soft delete | Nastaví sa pri odobratí páčika; opätovný páčik záznam obnoví. |

Unikátny kľúč likes\_actor\_likeable\_type\_unique — s predponou podľa názvu tabuľky, ak ho zmeníte — pokrýva (actor\_type, actor\_id, likeable\_type, likeable\_id, type) — vrátane soft-deleted riadkov —, takže samotná databáza drží jeden riadok na aktéra, cieľový model a typ reakcie a každá operácia aj kontrola využíva presne toto vyhľadávanie. Publikovaná migrácia v skratke:

```php
$name = LikesConfig::table();                     // likes.table, read strictly

// Throws for an unrecognized value, so a typo in the host's config fails
// the migration instead of quietly building bigint columns.
$keyType = KeyType::fromConfig('likes.key_type');

Schema::create($name, function (Blueprint $table) use ($name, $keyType): void {
    $table->id();
    $table->morphKey('actor', $keyType, nullable: false);     // actor_type + actor_id
    $table->morphKey('likeable', $keyType, nullable: false);  // likeable_type + likeable_id
    $table->string('type', 64)->default('like');              // 64 keeps the unique index within InnoDB's key limit
    $table->timestamps();
    $table->softDeletes();

    // One row per actor + likeable + reaction type, soft-deleted rows included.
    $table->unique(
        ['actor_type', 'actor_id', 'likeable_type', 'likeable_id', 'type'],
        $name.'_actor_likeable_type_unique',
    );
});
```

morphKey() je Blueprint makro z balíka Roundly package toolkit. Service provider ho registruje pri štarte, takže existuje skôr, než spustíte php artisan migrate.

## Typy kľúčov

key\_type určuje typ oboch polymorfných dvojíc, takže aktéri aj cieľové modely zdieľajú jeden typ kľúča. Zvoľte ten, ktorý zodpovedá vašim modelom:

| key\_type | Polymorfné stĺpce | Použite, keď vaše modely… |
| --- | --- | --- |
| `bigint` | morphs() — id ako unsigned big integer | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
| `uuid` | uuidMorphs() | používajú HasUuids |
| `ulid` | ulidMorphs() | používajú HasUlids |

Nastavte ho pred publikovaním a spustením migrácie:

```bash
LIKES_KEY_TYPE=uuid   # bigint (default) | uuid | ulid
```

```php
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Likes\Traits\GivesLikes;
use RoundlyConsulting\Likes\Traits\HasLikes;

class User extends Model
{
    use GivesLikes, HasUuids;
}

class Post extends Model
{
    use HasLikes, HasUuids;
}
```

Prázdna hodnota (LIKES\_KEY\_TYPE=) sa považuje za nenastavenú a ponechá bigint. Iná hodnota pri spustení migrácie vyhodí InvalidConfigurationException, namiesto aby sa potichu vytvorili stĺpce bigint.

## Soft deletes

Odobratie páčika označí záznam ako zmazaný (soft delete) a opätovný páčik ho obnoví namiesto vloženia duplicitného riadku — každý aktér má jediný záznam na cieľový model a typ reakcie. Kontroly, počty, scopy aj prehľady takto zmazané záznamy ignorujú.

## Vlastný model a tabuľka

Ak chcete pridať vlastné správanie, zdeďte model balíka a nasmerujte naň konfiguráciu:

```php
namespace App\Models;

use RoundlyConsulting\Likes\Models\Like as BaseLike;

class Like extends BaseLike
{
    // your own casts, relations or scopes
}
```

```php
// config/likes.php
'model' => App\Models\Like::class,
```

Model číta likes.table, pokiaľ vaša podtrieda explicitne nenastaví $table — explicitné $table má prednosť, ako to Eloquent predpokladá, pri zápisoch aj vo všetkých scopoch (vrátane withLikedState(), orderByLikeScore(), orderByTrending(), likesOf() a likedItems()). Nakonfigurovaná trieda, ktorá nie je model balíka ani jeho podtrieda, vyhodí InvalidConfigurationException s názvom kľúča — nikdy sa potichu nenahradí modelom balíka.

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