@@ -80,6 +80,28 @@ public function persist($model, IdentityMap $identityMap = null): Promise
8080 return $ deferred ->promise ();
8181 }
8282
83+ public function remove ($ model , IdentityMap $ identityMap = null ): Promise
84+ {
85+ $ deferred = new Deferred ();
86+
87+ Loop::defer (wrap (function () use ($ deferred , $ model , $ identityMap ) {
88+ if (null === $ identityMap ) {
89+ $ identityMap = new IdentityMap ();
90+ }
91+
92+ /** @var ClassMetadata $classMetadata */
93+ $ classMetadata = $ this ->metadataFactory ->getMetadataForClass (get_class ($ model ));
94+
95+ yield $ this ->redisClient ->del ($ this ->getKey ($ classMetadata , $ model ));
96+
97+ $ identityMap ->delete ($ classMetadata , $ this ->getIdFromModel ($ classMetadata , $ model ));
98+
99+ $ deferred ->resolve (true );
100+ }));
101+
102+ return $ deferred ->promise ();
103+ }
104+
83105 public function find (string $ class , string $ id , int $ depthLevel = 1 , IdentityMap $ identityMap = null ): Promise
84106 {
85107 $ deferred = new Deferred ();
@@ -101,36 +123,40 @@ public function find(string $class, string $id, int $depthLevel = 1, IdentityMap
101123
102124 $ modelData = yield $ this ->redisClient ->hGetAll ($ this ->getKeyByClassNameId ($ class , $ id ));
103125
104- /** @var PropertyMetadata $propertyMetadata */
105- foreach ($ classMetadata ->propertyMetadata as $ propertyMetadata ) {
106- if (array_key_exists ($ propertyMetadata ->name , $ modelData )) {
107- if ($ propertyMetadata ->isField ) {
108- $ propertyMetadata ->setValue ($ modelInstance , $ modelData [$ propertyMetadata ->name ]);
109- } elseif ($ depthLevel <= $ this ->maxDepthLevel && !empty ($ modelData [$ propertyMetadata ->name ])) {
110- if ($ propertyMetadata ->referenceType === 'one ' ) {
111- $ referenceModel = yield $ this ->find (
112- $ propertyMetadata ->referenceTarget ,
113- $ modelData [$ propertyMetadata ->name ],
114- $ depthLevel + 1 ,
115- $ identityMap
116- );
117- $ propertyMetadata ->setValue ($ modelInstance , $ referenceModel );
118- } elseif ($ propertyMetadata ->referenceType === 'many ' ) {
119- $ referenceModels = [];
120- foreach (explode (', ' , $ modelData [$ propertyMetadata ->name ]) as $ referenceId ) {
121- $ referenceModels [] = $ this ->find (
126+ if (empty ($ modelData )) {
127+ $ modelInstance = null ;
128+ } else {
129+ /** @var PropertyMetadata $propertyMetadata */
130+ foreach ($ classMetadata ->propertyMetadata as $ propertyMetadata ) {
131+ if (array_key_exists ($ propertyMetadata ->name , $ modelData )) {
132+ if ($ propertyMetadata ->isField ) {
133+ $ propertyMetadata ->setValue ($ modelInstance , $ modelData [$ propertyMetadata ->name ]);
134+ } elseif ($ depthLevel <= $ this ->maxDepthLevel && !empty ($ modelData [$ propertyMetadata ->name ])) {
135+ if ($ propertyMetadata ->referenceType === 'one ' ) {
136+ $ referenceModel = yield $ this ->find (
122137 $ propertyMetadata ->referenceTarget ,
123- $ referenceId ,
138+ $ modelData [ $ propertyMetadata -> name ] ,
124139 $ depthLevel + 1 ,
125140 $ identityMap
126141 );
142+ $ propertyMetadata ->setValue ($ modelInstance , $ referenceModel );
143+ } elseif ($ propertyMetadata ->referenceType === 'many ' ) {
144+ $ referenceModels = [];
145+ foreach (explode (', ' , $ modelData [$ propertyMetadata ->name ]) as $ referenceId ) {
146+ $ referenceModels [] = $ this ->find (
147+ $ propertyMetadata ->referenceTarget ,
148+ $ referenceId ,
149+ $ depthLevel + 1 ,
150+ $ identityMap
151+ );
152+ }
153+
154+ if (count ($ referenceModels ) > 0 ) {
155+ $ referenceModels = yield all ($ referenceModels );
156+ }
157+
158+ $ propertyMetadata ->setValue ($ modelInstance , $ referenceModels );
127159 }
128-
129- if (count ($ referenceModels ) > 0 ) {
130- $ referenceModels = yield all ($ referenceModels );
131- }
132-
133- $ propertyMetadata ->setValue ($ modelInstance , $ referenceModels );
134160 }
135161 }
136162 }
0 commit comments