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, predvolene like | Typ reakcie. |
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:
$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_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:
LIKES_KEY_TYPE=uuid # bigint (default) | uuid | uliduse 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 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.