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

Cachované agregáty

Priebežné agregáty sa počítajú na požiadanie. Pri vyťažených výpisoch uložte reviews_count a reviews_avg priamo do tabuľky hodnoteného modelu a nechajte balík, aby ich udržiaval:

  • Nastavte reviews.cache_aggregates na true (REVIEWS_CACHE_AGGREGATES=true).
  • Publikujte stub reviews-aggregate-migrations, premenujte zástupnú tabuľku na tabuľku vášho modelu a spustite migráciu.
  • Pridajte tomuto modelu trait MaintainsReviewAggregates popri HasReviews.
php artisan vendor:publish --tag="reviews-aggregate-migrations"
php artisan migrate
// database/migrations/…_add_review_aggregates_to_reviewable_table.php
Schema::table('products', function (Blueprint $table): void {   // was 'reviewable_table'
    $table->unsignedInteger('reviews_count')->default(0);
    $table->decimal('reviews_avg', 8, 4)->nullable();
});
use RoundlyConsulting\Reviews\Concerns\HasReviews;
use RoundlyConsulting\Reviews\Concerns\MaintainsReviewAggregates;

class Product extends Model
{
    use HasReviews;
    use MaintainsReviewAggregates;
}

Stub publikujte raz pre každú tabuľku — každé publikovanie vytvorí migráciu s novou časovou pečiatkou.

Ako sa udržiavajú aktuálne

Observer prepočíta stĺpce vždy, keď sa recenzia najvyššej úrovne uloží, zmaže alebo obnoví — aktualizujú sa teda pri vytvorení, úprave, schválení, zamietnutí aj zmazaní. Používa rovnakú logiku (schválené, najvyššia úroveň) ako priebežné agregáty, cieleným updatom zapíše len tieto dva stĺpce (bez udalostí modelu, bez zmeny updated_at a bez iných neuložených zmien na vašom modeli) a ignoruje odpovede vlastníka aj predmety bez traitu:

// Read and sort on plain columns — no aggregate query per row:
$top = Product::query()->orderByDesc('reviews_avg')->take(10)->get();

$product->reviews_count;   // 320
$product->reviews_avg;     // 4.6000

$product->recountReviews(); // recompute and write the two columns on demand

Súbežne pridané recenzie sa vždy započítajú. Prepočet beží v jednej transakcii pod zámkom riadka predmetu a počíta zamykajúcim čítaním; v transakcii observer zamkne predmet ešte pred zápisom riadka recenzie. Všetci zapisovatelia jedného predmetu tak berú zámky v rovnakom poradí, preto sa dve schválené recenzie, ktoré prídu naraz, spracujú postupne — bez deadlocku a bez strateného započítania.

Vlastné názvy stĺpcov

Ak máte existujúcu schému, prepíšte dve metódy s názvami stĺpcov:

class Product extends Model
{
    use HasReviews;
    use MaintainsReviewAggregates;

    public function aggregateCountColumn(): string
    {
        return 'rating_count';
    }

    public function aggregateAvgColumn(): string
    {
        return 'rating_average';
    }
}

Prepočet

Po pridaní stĺpcov naplňte existujúce riadky, alebo ich kedykoľvek prepočítajte od nuly. Príkaz prechádza model po dávkach po 100 a skončí chybou, ak trieda nie je Eloquent model alebo nepoužíva trait:

php artisan reviews:recount "App\Models\Product"

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.