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

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ĺpecTypPoznámka
idautoinkrementVždy autoinkrementálny kľúč bez ohľadu na key_type.
actor_type, actor_idpolymorfná dvojica (unikátny kľúč)Model, ktorý páčik dal. Typ actor_id určuje key_type.
likeable_type, likeable_idpolymorfná dvojica (unikátny kľúč)Model, ktorý páčik dostal. Typ likeable_id určuje key_type.
typestring, predvolene likeTyp reakcie.
created_at, updated_attimestampsPodľa created_at sa počíta okno trendov.
deleted_atsoft deleteNastaví 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:

$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')->default('like');
    $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_typePolymorfné stĺpcePoužite, keď vaše modely…
bigintmorphs() — id ako unsigned big integerpoužívajú predvolené autoinkrementálne kľúče Laravelu (predvolené)
uuiduuidMorphs()používajú HasUuids
ulidulidMorphs()používajú HasUlids

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

LIKES_KEY_TYPE=uuid   # bigint (default) | uuid | ulid
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:

namespace App\Models;

use RoundlyConsulting\Likes\Models\Like as BaseLike;

class Like extends BaseLike
{
    // your own casts, relations or scopes
}
// 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á. 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

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.