WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 1d523b9

Browse files
author
Josh Ralph
committed
Updated Buildable trait to parse out Expressions to strings when generating cache keys
1 parent bdf0df6 commit 1d523b9

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

src/Traits/Buildable.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php namespace GeneaLabs\LaravelModelCaching\Traits;
22

3+
use Illuminate\Database\Query\Expression;
34
use Illuminate\Pagination\Paginator;
45

56
/**
@@ -13,11 +14,16 @@ public function avg($column)
1314
return parent::avg($column);
1415
}
1516

16-
$cacheKey = $this->makeCacheKey(["*"], null, "-avg_{$column}");
17+
$cacheKey = $this->makeCacheKey(["*"], null, "-avg_{$this->expressionToString($column)}");
1718

1819
return $this->cachedValue(func_get_args(), $cacheKey);
1920
}
2021

22+
public function average($column)
23+
{
24+
return $this->avg($column);
25+
}
26+
2127
public function count($columns = "*")
2228
{
2329
if (! $this->isCachable()) {
@@ -215,7 +221,7 @@ public function sum($column)
215221
return parent::sum($column);
216222
}
217223

218-
$cacheKey = $this->makeCacheKey(["*"], null, "-sum_{$column}");
224+
$cacheKey = $this->makeCacheKey(["*"], null, "-sum_{$this->expressionToString($column)}");
219225

220226
return $this->cachedValue(func_get_args(), $cacheKey);
221227
}
@@ -333,4 +339,13 @@ function () use ($arguments, $cacheKey, $method) {
333339
}
334340
);
335341
}
342+
343+
private function expressionToString(Expression|string $value): string
344+
{
345+
if (is_string($value)) {
346+
return $value;
347+
}
348+
349+
return $value->getValue($this->query->getGrammar());
350+
}
336351
}

tests/Integration/CachedBuilderTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
66
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
77
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
8+
use Illuminate\Database\Query\Expression;
89
use Illuminate\Support\Str;
910

1011
/**
@@ -180,6 +181,27 @@ public function testAvgModelResultsCreatesCache()
180181
$this->assertEquals($liveResult, $cachedResult);
181182
}
182183

184+
public function testRawAvgModelResultsCreatesCache()
185+
{
186+
$authorId = (new Author)->with('books', 'profile')
187+
->avg(new Expression('id + id'));
188+
$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-avg_id + id");
189+
$tags = [
190+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
191+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesbook",
192+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesprofile",
193+
];
194+
195+
$cachedResult = $this->cache()
196+
->tags($tags)
197+
->get($key)['value'];
198+
$liveResult = (new UncachedAuthor)->with('books', 'profile')
199+
->avg(new Expression('id + id'));
200+
201+
$this->assertEquals($authorId, $cachedResult);
202+
$this->assertEquals($liveResult, $cachedResult);
203+
}
204+
183205
public function testChunkModelResultsCreatesCache()
184206
{
185207
$chunkedAuthors = [];
@@ -356,6 +378,26 @@ public function testSumModelResultsCreatesCache()
356378
$this->assertEquals($liveResult, $cachedResult);
357379
}
358380

381+
public function testRawSumModelResultsCreatesCache()
382+
{
383+
$authorId = (new Author)->with('books', 'profile')
384+
->sum(new Expression('`id` + `id`'));
385+
$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-sum_`id` + `id`");
386+
$tags = [
387+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesauthor",
388+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesbook",
389+
"genealabs:laravel-model-caching:testing:{$this->testingSqlitePath}testing.sqlite:genealabslaravelmodelcachingtestsfixturesprofile",
390+
];
391+
392+
$cachedResult = $this->cache()->tags($tags)
393+
->get($key)['value'];
394+
$liveResult = (new UncachedAuthor)->with('books', 'profile')
395+
->sum(new Expression('`id` + `id`'));
396+
397+
$this->assertEquals($authorId, $cachedResult);
398+
$this->assertEquals($liveResult, $cachedResult);
399+
}
400+
359401
public function testValueModelResultsCreatesCache()
360402
{
361403
$authorName = (new Author)->with('books', 'profile')

0 commit comments

Comments
 (0)