@@ -20,83 +20,128 @@ protected function cache(array $tags = [])
20
20
return $ cache ;
21
21
}
22
22
23
- protected function cacheResults (Relation $ relation , array $ models , string $ name ) : array
23
+ // protected function cacheResults(Relation $relation, array $models, string $name) : array
24
+ // {
25
+ // $parentIds = implode('_', collect($models)->pluck('id')->toArray());
26
+ // $parentName = str_slug(get_class($relation->getParent()));
27
+ // $childName = str_slug(get_class($relation->getRelated()));
28
+ //
29
+ // $cachedResults = $this->cache([$parentName, $childName])->rememberForever(
30
+ // "{$parentName}_{$parentIds}-{$childName}s",
31
+ // function () use ($relation, $models, $name) {
32
+ // return $relation->match(
33
+ // $relation->initRelation($models, $name),
34
+ // $relation->getEager(),
35
+ // $name
36
+ // );
37
+ // }
38
+ // );
39
+ //
40
+ // return $cachedResults;
41
+ // }
42
+ //
43
+ // protected function eagerLoadRelation(array $models, $name, Closure $constraints)
44
+ // {
45
+ // $relation = $this->getRelation($name);
46
+ // $relation->addEagerConstraints($models);
47
+ // $constraints($relation);
48
+ //
49
+ // return $this->cacheResults($relation, $models, $name);
50
+ // }
51
+
52
+ protected function getCacheKey (array $ columns = ['* ' ], $ ids = null ) : string
24
53
{
25
- $ parentIds = implode ('_ ' , collect ($ models )->pluck ('id ' )->toArray ());
26
- $ parentName = str_slug (get_class ($ relation ->getParent ()));
27
- $ childName = str_slug (get_class ($ relation ->getRelated ()));
28
-
29
- $ cachedResults = $ this ->cache ([$ parentName , $ childName ])->rememberForever (
30
- "{$ parentName }_ {$ parentIds }- {$ childName }s " ,
31
- function () use ($ relation , $ models , $ name ) {
32
- return $ relation ->match (
33
- $ relation ->initRelation ($ models , $ name ),
34
- $ relation ->getEager (),
35
- $ name
36
- );
37
- }
38
- );
39
-
40
- return $ cachedResults ;
54
+ $ key = str_slug (get_class ($ this ->model ));
55
+
56
+ if ($ ids ) {
57
+ $ key .= '_ ' . (is_array ($ ids )
58
+ ? implode ('_ ' , $ ids )
59
+ : $ ids );
60
+ }
61
+
62
+ if ($ columns !== ['* ' ]) {
63
+ $ key .= '_ ' . implode ('_ ' , $ columns );
64
+ }
65
+
66
+ $ key .= collect ($ this ->query ->wheres )->reduce (function ($ carry , $ where ) {
67
+ $ value = $ where ['value ' ] ?? implode ('_ ' , $ where ['values ' ]) ?? '' ;
68
+
69
+ return "{$ carry }- {$ where ['column ' ]}_ {$ value }" ;
70
+ });
71
+
72
+ if (collect ($ this ->eagerLoad )->isNotEmpty ()) {
73
+ $ key .= '- ' . implode ('- ' , collect ($ this ->eagerLoad )->keys ()->toArray ());
74
+ }
75
+
76
+ if ($ this ->query ->offset ) {
77
+ $ key .= "-offset_ {$ this ->query ->offset }" ;
78
+ }
79
+
80
+ if ($ this ->query ->limit ) {
81
+ $ key .= "-limit_ {$ this ->query ->limit }" ;
82
+ }
83
+
84
+ return $ key ;
41
85
}
42
86
43
- protected function eagerLoadRelation ( array $ models , $ name , Closure $ constraints )
87
+ protected function getCacheTags () : array
44
88
{
45
- $ relation = $ this ->getRelation ($ name );
46
- $ relation ->addEagerConstraints ($ models );
47
- $ constraints ($ relation );
89
+ return collect ($ this ->eagerLoad )->keys ()
90
+ ->map (function ($ name ) {
91
+ return str_slug (get_class (
92
+ $ this ->model
93
+ ->{$ name }()
94
+ ->getQuery ()
95
+ ->model
96
+ ));
97
+ })
98
+ ->prepend (str_slug (get_class ($ this ->model )))
99
+ ->values ()
100
+ ->toArray ();
101
+ }
48
102
49
- return $ this ->cacheResults ($ relation , $ models , $ name );
103
+ public function count ($ columns = ['* ' ])
104
+ {
105
+ $ tags = [str_slug (get_class ($ this ->model ))];
106
+ $ key = str_slug (get_class ($ this ->model )) ."-count " ;
107
+
108
+ return $ this ->cache ($ tags )
109
+ ->rememberForever ($ key , function () use ($ columns ) {
110
+ return parent ::count ($ columns );
111
+ });
50
112
}
51
113
52
114
/**
53
115
* @SuppressWarnings(PHPMD.ShortVariable)
54
116
*/
55
117
public function find ($ id , $ columns = ['* ' ])
56
118
{
57
- $ tag = str_slug ( get_class ( $ this ->model ) );
58
- $ key = "{ $ tag } _ { $ id } _ " . implode ( ' _ ' , $ columns );
119
+ $ tags = $ this ->getCacheTags ( );
120
+ $ key = $ this -> getCacheKey ( $ columns , $ id );
59
121
60
- return $ this ->cache ([ $ tag ] )
122
+ return $ this ->cache ($ tags )
61
123
->rememberForever ($ key , function () use ($ id , $ columns ) {
62
124
return parent ::find ($ id , $ columns );
63
125
});
64
126
}
65
127
66
- public function count ($ columns = '* ' )
67
- {
68
- $ tag = str_slug (get_class ($ this ->model ));
69
- $ key = "{$ tag }_ " . implode ('_ ' , $ columns );
70
-
71
- return $ this ->cache ([$ tag ])
72
- ->rememberForever ($ key , function () use ($ id , $ columns ) {
73
- return parent ::count ($ columns );
74
- });
75
- }
76
-
77
128
public function first ($ columns = ['* ' ])
78
129
{
79
- $ tag = str_slug ( get_class ( $ this ->model ) );
80
- $ key = "{ $ tag } _ " . implode ( ' _ ' , $ columns );
130
+ $ tags = $ this ->getCacheTags ( );
131
+ $ key = $ this -> getCacheKey ( $ columns );
81
132
82
- return $ this ->cache ([ $ tag ] )
83
- ->rememberForever ($ key , function () use ($ id , $ columns ) {
133
+ return $ this ->cache ($ tags )
134
+ ->rememberForever ($ key , function () use ($ columns ) {
84
135
return parent ::first ($ columns );
85
136
});
86
137
}
87
138
88
139
public function get ($ columns = ['* ' ])
89
140
{
90
- $ tag = str_slug (get_class ($ this ->model ));
91
- $ key = "{$ tag }_ " . implode ('_ ' , $ columns );
92
- $ key .= collect ($ this ->query ->wheres )->reduce (function ($ carry , $ where ) {
93
- $ value = $ where ['value ' ] ?? implode ('_ ' , $ where ['values ' ]) ?? '' ;
94
-
95
- return "{$ carry }- {$ where ['column ' ]}_ {$ value }" ;
96
- });
97
- $ key .= '- ' . implode ('- ' , collect ($ this ->eagerLoad )->keys ()->toArray ());
141
+ $ tags = $ this ->getCacheTags ();
142
+ $ key = $ this ->getCacheKey ($ columns );
98
143
99
- return $ this ->cache ([ $ tag ] )
144
+ return $ this ->cache ($ tags )
100
145
->rememberForever ($ key , function () use ($ columns ) {
101
146
return parent ::get ($ columns );
102
147
});
0 commit comments