diff --git a/src/Entity/Relations.php b/src/Entity/Relations.php index 77ccd1e..8791746 100644 --- a/src/Entity/Relations.php +++ b/src/Entity/Relations.php @@ -154,4 +154,20 @@ public function fetch($relation, $getAll = false) return $getAll ? $relation->fetchAll($this, $this->entityManager) : $relation->fetch($this, $this->entityManager); } + + /** + * Resets all loaded relations or $relation + * + * Helpful to reduce the size of serializations of the object (for caching, or toArray method etc.) + * + * @param null $relation + */ + public function resetRelated($relation = null) + { + if ($relation === null) { + $this->relatedObjects = []; + } else { + unset($this->relatedObjects[$relation]); + } + } } diff --git a/tests/Entity/RelationsTest.php b/tests/Entity/RelationsTest.php index 1f3c370..f4b6e82 100644 --- a/tests/Entity/RelationsTest.php +++ b/tests/Entity/RelationsTest.php @@ -2,6 +2,8 @@ namespace ORM\Test\Entity; +use Mockery as m; +use ORM\Entity; use ORM\EntityManager; use ORM\Exception\IncompletePrimaryKey; use ORM\Exception\InvalidConfiguration; @@ -227,7 +229,7 @@ public function provideRelationsWithCardinalityOne() * @test */ public function getRelatedReturnsResultFromFetchFor($class, $relation) { - $entity = \Mockery::mock($class)->makePartial(); + $entity = m::mock($class)->makePartial(); $related = new StudlyCaps(); $entity->shouldReceive('fetch')->with($relation, true)->once()->andReturn($related); @@ -240,7 +242,7 @@ public function getRelatedReturnsResultFromFetchFor($class, $relation) * @test */ public function getRelatedStoresTheValue($class, $relation) { - $entity = \Mockery::mock($class)->makePartial(); + $entity = m::mock($class)->makePartial(); $related = new StudlyCaps(); $entity->shouldReceive('fetch')->with($relation, true)->once()->andReturn($related); $entity->getRelated($relation); @@ -254,7 +256,7 @@ public function getRelatedStoresTheValue($class, $relation) * @test */ public function refreshsRelationWithRefresh($class, $relation) { - $entity = \Mockery::mock($class)->makePartial(); + $entity = m::mock($class)->makePartial(); $related = new StudlyCaps(); $entity->shouldReceive('fetch')->with($relation, true)->twice()->andReturn($related); $entity->getRelated($relation); @@ -268,7 +270,7 @@ public function refreshsRelationWithRefresh($class, $relation) * @test */ public function getRelatedDoesNotStoreNullValues($class, $relation) { - $entity = \Mockery::mock($class)->makePartial(); + $entity = m::mock($class)->makePartial(); $related = new StudlyCaps(); $entity->shouldReceive('fetch')->with($relation, true)->twice()->andReturn(null, $related); $entity->getRelated($relation); @@ -278,6 +280,39 @@ public function getRelatedDoesNotStoreNullValues($class, $relation) self::assertSame($related, $result); } + /** @test */ + public function resetsAllLoadedRelations() + { + /** @var Entity|m\MockInterface $entity */ + $entity = m::mock(RelationExample::class)->makePartial(); + foreach (['dmgd', 'mySnake'] as $relation) { + $related = new StudlyCaps(); + $entity->shouldReceive('fetch')->with($relation, true)->twice()->andReturn($related, $related); + $entity->getRelated($relation); + } + + $entity->resetRelated(); + $entity->getRelated('dmgd'); + $entity->getRelated('mySnake'); + } + + /** @test */ + public function resetsSpecificRelation() + { + /** @var Entity|m\MockInterface $entity */ + $entity = m::mock(RelationExample::class)->makePartial(); + $related = new StudlyCaps(); + $entity->shouldReceive('fetch')->with('dmgd', true)->twice()->andReturn($related, $related); + $entity->getRelated('dmgd'); + $related = new StudlyCaps(); + $entity->shouldReceive('fetch')->with('mySnake', true)->once()->andReturn($related, $related); + $entity->getRelated('mySnake'); + + $entity->resetRelated('dmgd'); + $entity->getRelated('dmgd'); + $entity->getRelated('mySnake'); + } + /** @test */ public function setRelationStoresTheId() { @@ -326,7 +361,7 @@ public function setRelationThrowsForNonOwner() /** @test */ public function setRelationStoresTheRelatedObject() { - $entity = \Mockery::mock(RelationExample::class)->makePartial(); + $entity = m::mock(RelationExample::class)->makePartial(); $related = new StudlyCaps(['id' => 42]); $entity->shouldNotReceive('fetch')->with('studlyCaps', null, true); $entity->setRelated('studlyCaps', $related); @@ -356,7 +391,7 @@ public function addRelatedCreatesTheAssociation() $category = new Category(['id' => 23]); $this->pdo->shouldReceive('query') ->with('INSERT INTO "article_category" ("article_id","category_id") VALUES (42,23)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->addRelated('categories', [$category]); } @@ -369,7 +404,7 @@ public function addRelatedCreatesAMultilineInsert() $category2 = new Category(['id' => 24]); $this->pdo->shouldReceive('query') ->with('INSERT INTO "article_category" ("article_id","category_id") VALUES (42,23),(42,24)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->addRelated('categories', [$category1, $category2]); } @@ -434,7 +469,7 @@ public function addRelatedAllowsToPassEntityManager() $category = new Category(['id' => 23]); $this->pdo->shouldReceive('query') ->with('INSERT INTO "article_category" ("article_id","category_id") VALUES (42,23)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->addRelated('categories', [$category]); } @@ -446,7 +481,7 @@ public function deleteRelatedDeletesTheAssociation() $category = new Category(['id' => 23]); $this->pdo->shouldReceive('query') ->with('DELETE FROM "article_category" WHERE "article_id" = 42 AND ("category_id" = 23)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->deleteRelated('categories', [$category]); } @@ -460,7 +495,7 @@ public function deleteRelatedExecutesOnlyOneStatement() $this->pdo->shouldReceive('query') ->with('DELETE FROM "article_category" WHERE "article_id" = 42 ' . 'AND ("category_id" = 23 OR "category_id" = 24)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->deleteRelated('categories', [$category1, $category2]); } @@ -526,7 +561,7 @@ public function deleteRelatedAllowsToPassEntityManager() $this->pdo->shouldReceive('query') ->with('DELETE FROM "article_category" WHERE "article_id" = 42 ' . 'AND ("category_id" = 23)') - ->once()->andReturn(\Mockery::mock(\PDOStatement::class)); + ->once()->andReturn(m::mock(\PDOStatement::class)); $article->deleteRelated('categories', [$category]); }