Databázová schéma a typy kľúčov
Balík používa jedinú tabuľku. Jej názov určuje konfiguračný kľúč table:
| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint, uuid alebo ulid | Primárny kľúč podľa primary_key_type — predvolene autoinkrementálny bigint, bez ohľadu na key_type. |
reporter_type / reporter_id | nullable morph | Nahlasovateľ — null pri hlásení hosťa a anonymnom hlásení. |
reported_type / reported_id | nullable morph | Nahlásený subjekt. |
resolved_by_type / resolved_by_id | nullable morph | Moderátor, ktorý hlásenie vybavil — null pri systémových akciách. |
status | string, indexovaný | Hodnota stavu, predvolene pending. |
reason | string, indexovaný | Slug dôvodu. |
description | text, nullable | Popis od nahlasovateľa. |
resolution_note | text, nullable | Poznámka moderátora. |
guest_identifier | string, nullable, indexovaný | Hašovaná IP adresa alebo e-mail na deduplikáciu hlásení hostí. |
resolved_at | timestamp, nullable | Kedy bolo hlásenie vyriešené alebo zamietnuté. |
created_at / updated_at | timestamps | Štandardné časové značky Eloquentu. |
deleted_at | timestamp, nullable | Soft delete. |
Dva zložené indexy obsluhujú najčastejšie dotazy: (reported_type, reported_id, status) pre agregácie a kontrolu prahu a deduplikačný index nad (reported_type, reported_id, reporter_type, reporter_id) s názvom <table>_dedupe_index.
Typ morph kľúča
key_type určuje typ id stĺpca všetkých troch morph dvojíc — reporter, reported a resolved_by. Vlastný primárny kľúč tabuľky nastavuje samostatne primary_key_type (nižšie):
| key_type | Morph id stĺpce | Použite, ak vaše modely majú |
|---|---|---|
bigint | bigint | Autoinkrementálne celočíselné kľúče (predvolené). |
uuid | uuid | UUID primárne kľúče (HasUuids). |
ulid | char(26) | ULID primárne kľúče (HasUlids). |
Pri hodnote uuid alebo ulid musia modely nahlasovateľov, nahlásených subjektov aj moderátorov používať reťazcové primárne kľúče. Nastavte ju pred migráciou — určuje typy stĺpcov:
REPORTS_KEY_TYPE=uuiduse Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Reports\Traits\GivesReports;
class User extends Model
{
use GivesReports;
use HasUuids; // string primary key to match key_type = uuid
}Nenastavený alebo prázdny kľúč znamená bigint; neznáma hodnota pri spustení migrácie vyhodí InvalidConfigurationException z toolkitu, namiesto toho, aby potichu vytvorila stĺpce bigint.
Typ primárneho kľúča
primary_key_type určuje typ vlastného id tabuľky reports — kľúča, na ktorý odkazujú iné tabuľky: bigint (predvolený, autoinkrementálny), uuid alebo ulid. Pri uuid alebo ulid model Report pri vytvorení vygeneruje UUIDv7 alebo ULID a route binding považuje chybne zapísané id za nenájdené. Rovnako ako key_type ho číta migrácia pri spustení a neznáma hodnota vyhodí InvalidConfigurationException.
Rozhodujúci je pri moderácii. Moderované hlásenie je subjektom approvals a approvals-for-laravel určuje typ stĺpcov subjektu tým istým approvals.key_type ako typ stĺpcov moderátorov, takže na PostgreSQL sa oba typy musia zhodovať — pri bigint id hlásení a moderátoroch s UUID kľúčmi otvorenie moderácie zlyhá. Ak máte moderátorov s UUID, nastavte pred migráciou oba:
APPROVALS_KEY_TYPE=uuid
REPORTS_PRIMARY_KEY_TYPE=uuidkey_type sa naďalej riadi modelmi nahlasovateľov, nahlásených subjektov a tých, ktorí hlásenia vybavujú; vybavuje ich moderátor, takže pri moderátoroch s UUID je tiež uuid. Moderácia s UUID na PostgreSQL navyše potrebuje migráciu 0007 balíka approvals-for-laravel, ktorá zmení approvals.approval_request_id na bigint — ak ste migrácie approvals publikovali skôr, než existovala, publikujte ich znova. MySQL a SQLite pri nezhode nezlyhajú, no zhodné typy kľúčov sú aj tak bezpečnejšie nastavenie.
Prevod existujúcej inštalácie
Typ kľúča sa určí pri prvom spustení migrácie: neskoršia zmena primary_key_type existujúcu tabuľku nezmení a model nastavený na uuid alebo ulid nad stĺpcom id typu bigint pokazí každé nové hlásenie. Automatický prevod neexistuje. Napíšte vlastnú migráciu — so zastavenými zápismi a so zálohou:
- Pridajte do tabuľky reports nullable stĺpec uuid (alebo ulid) a pre každý riadok ho naplňte cez Str::uuid7() alebo Str::ulid(); uchovajte si mapu starého id na nové.
- Podľa mapy prepíšte každý odkaz na hlásenie: approval_requests.subject_id a approvals.approvable_id tam, kde typový stĺpec obsahuje morph triedu hlásenia, a tiež každý vlastný stĺpec s id hlásenia. Ak meníte aj APPROVALS_KEY_TYPE, v tej istej migrácii preveďte aj vlastné morph stĺpce approvals.
- Odstráňte starý primárny kľúč id, nový stĺpec premenujte na id a nastavte ho ako primárny kľúč.
- Nastavte REPORTS_PRIMARY_KEY_TYPE na nový typ a nasaďte.
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.