Skip to content

Commit

Permalink
implement Entity::resetRelated to remove already loaded relations
Browse files Browse the repository at this point in the history
  • Loading branch information
tflori committed Mar 17, 2020
1 parent c948bf7 commit d7f1489
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 11 deletions.
16 changes: 16 additions & 0 deletions src/Entity/Relations.php
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}
}
}
57 changes: 46 additions & 11 deletions tests/Entity/RelationsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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()
{
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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]);
}
Expand All @@ -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]);
}
Expand Down Expand Up @@ -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]);
}
Expand All @@ -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]);
}
Expand All @@ -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]);
}
Expand Down Expand Up @@ -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]);
}
Expand Down

0 comments on commit d7f1489

Please sign in to comment.