$cacheConditions * * @mixin \Illuminate\Database\Eloquent\Model */ trait IsCachedAsCollection { public static function bootIsCachedAsCollection(): void { $flush = fn () => static::removeCached(); static::saved($flush); static::deleted($flush); } /** * @return \Illuminate\Database\Eloquent\Collection */ public static function getCached(): Collection { /** @var \Illuminate\Database\Eloquent\Collection */ return Cache::remember(static::getCacheKeyName(), 48 * 60 * 60, function () { $query = static::query(); if (property_exists(static::class, 'cacheConditions')) { // @phpstan-ignore property.staticAccess $query->where(static::$cacheConditions); } $results = static::queryCached($query)->get(); return static::filterQuery($results); }); } public static function removeCached(): void { Cache::forget(static::getCacheKeyName()); } /** * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ protected static function queryCached(Builder $query): Builder { return $query; } /** * @param \Illuminate\Database\Eloquent\Collection $results * @return \Illuminate\Database\Eloquent\Collection */ protected static function filterQuery(Collection $results): Collection { return $results; } protected static function getCacheKeyName(): string { return 'model_cache_' . strtolower(class_basename(static::class)); } }