@@ -20,83 +20,128 @@ protected function cache(array $tags = [])
2020 return $ cache ;
2121 }
2222
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
2453 {
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 ;
4185 }
4286
43- protected function eagerLoadRelation ( array $ models , $ name , Closure $ constraints )
87+ protected function getCacheTags () : array
4488 {
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+ }
48102
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+ });
50112 }
51113
52114 /**
53115 * @SuppressWarnings(PHPMD.ShortVariable)
54116 */
55117 public function find ($ id , $ columns = ['* ' ])
56118 {
57- $ tag = str_slug ( get_class ( $ this ->model ) );
58- $ key = "{ $ tag } _ { $ id } _ " . implode ( ' _ ' , $ columns );
119+ $ tags = $ this ->getCacheTags ( );
120+ $ key = $ this -> getCacheKey ( $ columns , $ id );
59121
60- return $ this ->cache ([ $ tag ] )
122+ return $ this ->cache ($ tags )
61123 ->rememberForever ($ key , function () use ($ id , $ columns ) {
62124 return parent ::find ($ id , $ columns );
63125 });
64126 }
65127
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-
77128 public function first ($ columns = ['* ' ])
78129 {
79- $ tag = str_slug ( get_class ( $ this ->model ) );
80- $ key = "{ $ tag } _ " . implode ( ' _ ' , $ columns );
130+ $ tags = $ this ->getCacheTags ( );
131+ $ key = $ this -> getCacheKey ( $ columns );
81132
82- return $ this ->cache ([ $ tag ] )
83- ->rememberForever ($ key , function () use ($ id , $ columns ) {
133+ return $ this ->cache ($ tags )
134+ ->rememberForever ($ key , function () use ($ columns ) {
84135 return parent ::first ($ columns );
85136 });
86137 }
87138
88139 public function get ($ columns = ['* ' ])
89140 {
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 );
98143
99- return $ this ->cache ([ $ tag ] )
144+ return $ this ->cache ($ tags )
100145 ->rememberForever ($ key , function () use ($ columns ) {
101146 return parent ::get ($ columns );
102147 });
0 commit comments