Skip to content

Commit 97024a5

Browse files
committed
Implement global cache parsing
1 parent 72c2fb4 commit 97024a5

22 files changed

+258
-55
lines changed

src/Traits/Caching.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,48 @@
11
<?php namespace GeneaLabs\LaravelModelCaching\Traits;
22

33
use Carbon\Carbon;
4+
use Closure;
5+
use GeneaLabs\LaravelModelCaching\CachedBuilder;
46
use GeneaLabs\LaravelModelCaching\CacheKey;
57
use GeneaLabs\LaravelModelCaching\CacheTags;
68
use Illuminate\Cache\TaggableStore;
79
use Illuminate\Database\Eloquent\Model;
10+
use Illuminate\Database\Eloquent\Scope;
811
use Illuminate\Database\Query\Builder;
912

1013
trait Caching
1114
{
1215
protected $isCachable = true;
16+
protected $scopesAreApplied = false;
17+
18+
protected function applyScopesToInstance()
19+
{
20+
if (! property_exists($this, "scopes")
21+
|| $this->scopesAreApplied
22+
) {
23+
return;
24+
}
25+
26+
foreach ($this->scopes as $identifier => $scope) {
27+
if (! isset($this->scopes[$identifier])) {
28+
continue;
29+
}
30+
31+
$this->scopesAreApplied = true;
32+
33+
$this->callScope(function () use ($scope) {
34+
if ($scope instanceof Closure) {
35+
$scope($this);
36+
}
37+
38+
if ($scope instanceof Scope
39+
&& $this instanceof CachedBuilder
40+
) {
41+
$scope->apply($this, $this->getModel());
42+
}
43+
});
44+
}
45+
}
1346

1447
public function cache(array $tags = [])
1548
{
@@ -78,6 +111,7 @@ protected function makeCacheKey(
78111
$idColumn = null,
79112
string $keyDifferentiator = ''
80113
) : string {
114+
$this->applyScopesToInstance();
81115
$eagerLoad = $this->eagerLoad ?? [];
82116
$model = $this;
83117

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures;
2+
3+
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
4+
use Illuminate\Database\Eloquent\Builder;
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\HasMany;
7+
use Illuminate\Database\Eloquent\Relations\HasOne;
8+
use Illuminate\Database\Eloquent\SoftDeletes;
9+
use GeneaLabs\LaravelModelCaching\CachedBuilder;
10+
11+
class AuthorWithInlineGlobalScope extends Model
12+
{
13+
use Cachable;
14+
use SoftDeletes;
15+
16+
protected $casts = [
17+
"finances" => "array",
18+
];
19+
protected $fillable = [
20+
'name',
21+
'email',
22+
"finances",
23+
];
24+
protected $table = "authors";
25+
26+
protected static function boot()
27+
{
28+
parent::boot();
29+
30+
static::addGlobalScope('inlineScope', function (CachedBuilder $builder) {
31+
return $builder->where('name', 'LIKE', "A%");
32+
});
33+
}
34+
35+
public function books() : HasMany
36+
{
37+
return $this->hasMany(Book::class);
38+
}
39+
40+
public function profile() : HasOne
41+
{
42+
return $this->hasOne(Profile::class);
43+
}
44+
45+
public function getLatestBookAttribute()
46+
{
47+
return $this
48+
->books()
49+
->latest("id")
50+
->first();
51+
}
52+
53+
public function scopeStartsWithA(Builder $query) : Builder
54+
{
55+
return $query->where('name', 'LIKE', 'A%');
56+
}
57+
58+
public function scopeNameStartsWith(Builder $query, string $startOfName) : Builder
59+
{
60+
return $query->where("name", "LIKE", "{$startOfName}%");
61+
}
62+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures;
2+
3+
use Illuminate\Database\Eloquent\Builder;
4+
use Illuminate\Database\Eloquent\Model;
5+
use Illuminate\Database\Eloquent\Relations\HasMany;
6+
use Illuminate\Database\Eloquent\Relations\HasOne;
7+
use Illuminate\Database\Eloquent\SoftDeletes;
8+
9+
class UncachedAuthorWithInlineGlobalScope extends Model
10+
{
11+
use SoftDeletes;
12+
13+
protected $casts = [
14+
"finances" => "array",
15+
];
16+
protected $fillable = [
17+
'name',
18+
'email',
19+
"finances",
20+
];
21+
protected $table = "authors";
22+
23+
protected static function boot()
24+
{
25+
parent::boot();
26+
27+
static::addGlobalScope('inlineScope', function (Builder $builder) {
28+
return $builder->where('name', 'LIKE', "A%");
29+
});
30+
}
31+
32+
public function books() : HasMany
33+
{
34+
return $this->hasMany(UncachedBook::class);
35+
}
36+
37+
public function profile() : HasOne
38+
{
39+
return $this->hasOne(UncachedProfile::class);
40+
}
41+
42+
public function getLatestBookAttribute()
43+
{
44+
return $this
45+
->books()
46+
->latest("id")
47+
->first();
48+
}
49+
50+
public function scopeStartsWithA(Builder $query) : Builder
51+
{
52+
return $query->where('name', 'LIKE', 'A%');
53+
}
54+
55+
public function scopeNameStartsWith(Builder $query, string $startOfName) : Builder
56+
{
57+
return $query->where("name", "LIKE", "{$startOfName}%");
58+
}
59+
}

tests/Integration/CachedBuilder/BooleanTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class BooleanTest extends IntegrationTestCase
88
{
99
public function testBooleanWhereCreatesCorrectCacheKey()
1010
{
11-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-is_famous_=_1");
11+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-is_famous_=_1-authors.deleted_at_null");
1212
$tags = [
1313
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
1414
];

tests/Integration/CachedBuilder/FindOrFailTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public function testFindOrFailCachesModels()
1111
$author = (new Author)
1212
->findOrFail(1);
1313

14-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-find_1");
14+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.deleted_at_null-find_1");
1515
$tags = [
1616
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
1717
];

tests/Integration/CachedBuilder/FindTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function testFindMultipleModelResultsCreatesCache()
2626
{
2727
$authors = (new Author)
2828
->find([1, 2, 3]);
29-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-find_list_1_2_3");
29+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.deleted_at_null-find_list_1_2_3");
3030
$tags = [
3131
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
3232
];

tests/Integration/CachedBuilder/ForceDeleteTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function testForceDeleteClearsCache()
1717
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
1818
])
1919
->get(sha1(
20-
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-id_=_1"
20+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-id_=_1-authors.deleted_at_null"
2121
))["value"];
2222

2323
(new Author)

tests/Integration/CachedBuilder/GetTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public function testGetModelResultsCreatesCache()
1010
{
1111
$authors = (new Author)->with('books', 'profile')
1212
->get();
13-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-testing:{$this->testingSqlitePath}testing.sqlite:books-testing:{$this->testingSqlitePath}testing.sqlite:profile");
13+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.deleted_at_null-testing:{$this->testingSqlitePath}testing.sqlite:books-testing:{$this->testingSqlitePath}testing.sqlite:profile");
1414
$tags = [
1515
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
1616
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesbook",
@@ -45,7 +45,7 @@ public function testAccessingGetResultsViaArrayIndexDoesNotError()
4545

4646
public function testGetWithFieldArrayCachesResults()
4747
{
48-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor_id_name");
48+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor_id_name-authors.deleted_at_null");
4949
$tags = [
5050
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
5151
];

tests/Integration/CachedBuilder/LazyLoadTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class LazyLoadTest extends IntegrationTestCase
1212
{
1313
public function testBelongsToRelationship()
1414
{
15-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.id_=_1-first");
15+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.id_=_1-authors.deleted_at_null-first");
1616
$tags = [
1717
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
1818
];

tests/Integration/CachedBuilder/PaginateTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function testPaginationIsCached()
1616
$authors = (new Author)
1717
->paginate(3);
1818

19-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-paginate_by_3_page_1");
19+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.deleted_at_null-paginate_by_3_page_1");
2020
$tags = [
2121
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
2222
];
@@ -149,7 +149,7 @@ public function testPaginationWithCustomOptionsReturnsCorrectLinks()
149149

150150
public function testCustomPageNamePagination()
151151
{
152-
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-paginate_by_3_custom-page_1");
152+
$key = sha1("genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:authors:genealabslaravelmodelcachingtestsfixturesauthor-authors.deleted_at_null-paginate_by_3_custom-page_1");
153153
$tags = [
154154
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
155155
];

0 commit comments

Comments
 (0)