관리-도구
편집 파일: QueryCacheable.php
<?php namespace Rennokki\QueryCache\Traits; use Rennokki\QueryCache\FlushQueryCacheObserver; use Rennokki\QueryCache\Query\Builder; /** * @method static bool flushQueryCache(array $tags = []) * @method static bool flushQueryCacheWithTag(string $string) * @method static \Illuminate\Database\Query\Builder|static cacheFor(\DateTime|int|null $time) * @method static \Illuminate\Database\Query\Builder|static cacheForever() * @method static \Illuminate\Database\Query\Builder|static dontCache() * @method static \Illuminate\Database\Query\Builder|static doNotCache() * @method static \Illuminate\Database\Query\Builder|static cachePrefix(string $prefix) * @method static \Illuminate\Database\Query\Builder|static cacheTags(array $cacheTags = []) * @method static \Illuminate\Database\Query\Builder|static appendCacheTags(array $cacheTags = []) * @method static \Illuminate\Database\Query\Builder|static cacheDriver(string $cacheDriver) * @method static \Illuminate\Database\Query\Builder|static cacheBaseTags(array $tags = []) */ trait QueryCacheable { /** * Boot the trait. * * @return void */ public static function bootQueryCacheable() { /** @var \Illuminate\Database\Eloquent\Model $this */ if (isset(static::$flushCacheOnUpdate) && static::$flushCacheOnUpdate) { static::observe( static::getFlushQueryCacheObserver() ); } } /** * Get the observer class name that will * observe the changes and will invalidate the cache * upon database change. * * @return string */ protected static function getFlushQueryCacheObserver() { return FlushQueryCacheObserver::class; } /** * Set the base cache tags that will be present * on all queries. * * @return array */ protected function getCacheBaseTags(): array { return [ (string) static::class, ]; } /** * When invalidating automatically on update, you can specify * which tags to invalidate. * * @param string|null $relation * @param \Illuminate\Database\Eloquent\Collection|null $pivotedModels * @return array */ public function getCacheTagsToInvalidateOnUpdate($relation = null, $pivotedModels = null): array { /** @var \Illuminate\Database\Eloquent\Model $this */ return $this->getCacheBaseTags(); } /** * {@inheritdoc} */ protected function newBaseQueryBuilder() { /** @var \Illuminate\Database\Eloquent\Model $this */ $connection = $this->getConnection(); $builder = new Builder( $connection, $connection->getQueryGrammar(), $connection->getPostProcessor() ); $builder->dontCache(); if (property_exists($this, 'cacheFor')) { $builder->cacheFor($this->cacheFor); } if (method_exists($this, 'cacheForValue')) { $builder->cacheFor($this->cacheForValue($builder)); } if (property_exists($this, 'cacheTags')) { $builder->cacheTags($this->cacheTags); } if (method_exists($this, 'cacheTagsValue')) { $builder->cacheTags($this->cacheTagsValue($builder)); } if (property_exists($this, 'cachePrefix')) { $builder->cachePrefix($this->cachePrefix); } if (method_exists($this, 'cachePrefixValue')) { $builder->cachePrefix($this->cachePrefixValue($builder)); } if (property_exists($this, 'cacheDriver')) { $builder->cacheDriver($this->cacheDriver); } if (method_exists($this, 'cacheDriverValue')) { $builder->cacheDriver($this->cacheDriverValue($builder)); } if (property_exists($this, 'cacheUsePlainKey')) { $builder->withPlainKey(); } if (method_exists($this, 'cacheUsePlainKeyValue')) { $builder->withPlainKey($this->cacheUsePlainKeyValue($builder)); } return $builder->cacheBaseTags($this->getCacheBaseTags()); } }