Skip to content

Commit 47c9870

Browse files
authored
Ensure computed values are stored in the database so they can be queried (#167)
1 parent 886427e commit 47c9870

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

src/Entries/Entry.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public static function makeModelFromContract(EntryContract $source)
4848
{
4949
$class = app('statamic.eloquent.entries.model');
5050

51-
$data = $source->data();
51+
$data = $source->data()
52+
->merge(method_exists($source, 'computedData') ? $source->computedData() : []);
53+
5254
$date = $source->hasDate() ? $source->date() : null;
5355

5456
$origin = $source->origin();

tests/Entries/EntryTest.php

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use Statamic\Eloquent\Entries\Entry;
99
use Statamic\Eloquent\Entries\EntryModel;
1010
use Statamic\Facades;
11+
use Statamic\Facades\Collection as CollectionFacade;
12+
use Statamic\Facades\Entry as EntryFacade;
1113
use Tests\TestCase;
1214

1315
class EntryTest extends TestCase
@@ -59,6 +61,70 @@ public function it_saves_to_entry_model()
5961
$this->assertEquals(collect($model->toArray())->except(['updated_at'])->all(), collect($entry->toModel()->toArray())->except('updated_at')->all());
6062
}
6163

64+
/** @test */
65+
public function it_stores_computed_values()
66+
{
67+
$collection = Collection::make('blog')->title('blog')->routes([
68+
'en' => '/blog/{slug}',
69+
])->save();
70+
71+
CollectionFacade::computed('blog', 'shares', function ($entry, $value) {
72+
return 150;
73+
});
74+
75+
$model = new EntryModel([
76+
'slug' => 'the-slug',
77+
'data' => [
78+
'foo' => 'bar',
79+
],
80+
]);
81+
82+
$entry = (new Entry())
83+
->collection('blog')
84+
->slug('the-slug')
85+
->data([
86+
'foo' => 'bar',
87+
]);
88+
89+
$entry->save();
90+
91+
$this->assertEquals(150, $entry->model()->data['shares']);
92+
}
93+
94+
/** @test */
95+
public function it_defers_to_the_live_computed_value_instead_of_the_stored_value()
96+
{
97+
$collection = Collection::make('blog')->title('blog')->routes([
98+
'en' => '/blog/{slug}',
99+
])->save();
100+
101+
CollectionFacade::computed('blog', 'shares', function ($entry, $value) {
102+
return ! isset($value) ? 150 : 100;
103+
});
104+
105+
$model = new EntryModel([
106+
'slug' => 'the-slug',
107+
'data' => [
108+
'foo' => 'bar',
109+
],
110+
]);
111+
112+
$entry = (new Entry())
113+
->collection('blog')
114+
->slug('the-slug')
115+
->data([
116+
'foo' => 'bar',
117+
]);
118+
119+
$entry->save();
120+
121+
$this->assertEquals(150, $entry->model()->data['shares']);
122+
123+
$freshEntry = EntryFacade::query()->where('slug', 'the-slug')->first();
124+
125+
$this->assertEquals(100, $freshEntry->shares);
126+
}
127+
62128
/** @test */
63129
public function it_propagates_entry_if_configured()
64130
{

0 commit comments

Comments
 (0)