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, ukladá potichu (bez udalostí 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 save quietly on demandVlastné 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 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.