1
0
mirror of synced 2025-02-10 01:09:26 +03:00

Expose EntityPersister::count() through EntityRepository::count()

This commit is contained in:
Javier Spagnoletti 2016-09-02 15:43:28 -03:00 committed by Marco Pivetta
parent 35341769ea
commit a90035e81a
5 changed files with 121 additions and 56 deletions

View File

@ -727,6 +727,14 @@ examples are equivalent:
// A single user by its nickname (__call magic) // A single user by its nickname (__call magic)
$user = $em->getRepository('MyProject\Domain\User')->findOneByNickname('romanb'); $user = $em->getRepository('MyProject\Domain\User')->findOneByNickname('romanb');
Additionally, you can just count the result of the provided conditions when you don't really need the data:
.. code-block:: php
<?php
// Check there is no user with nickname
$availableNickname = 0 === $em->getRepository('MyProject\Domain\User')->count(array('nickname' => 'nonexistent'));
By Criteria By Criteria
~~~~~~~~~~~ ~~~~~~~~~~~

View File

@ -1535,6 +1535,16 @@ As an example here is the code of the first use case "List of Bugs":
Using EntityRepositories you can avoid coupling your model with specific query logic. Using EntityRepositories you can avoid coupling your model with specific query logic.
You can also re-use query logic easily throughout your application. You can also re-use query logic easily throughout your application.
The method ``count()`` takes an array of fields or association keys and the values to match against.
This provides you with a convenient and lightweight way to count a resultset when you don't need to
deal with it:
.. code-block:: php
<?php
$productCount = $entityManager->getRepository('Product')
->count(array('name' => $productName));
Conclusion Conclusion
---------- ----------

View File

@ -196,16 +196,32 @@ class EntityRepository implements ObjectRepository, Selectable
} }
/** /**
* Adds support for magic finders. * Counts entities by a set of criteria.
*
* @todo Add this method to `ObjectRepository` interface in the next major release
*
* @param array $criteria
*
* @return int The quantity of objects that matches the criteria.
*/
public function count(array $criteria)
{
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->count($criteria);
}
/**
* Adds support for magic finders/counters.
* *
* @param string $method * @param string $method
* @param array $arguments * @param array $arguments
* *
* @return array|object The found entity/entities. * @return array|object|int The found entity/entities or its resulting count.
* *
* @throws ORMException * @throws ORMException
* @throws \BadMethodCallException If the method called is an invalid find* method * @throws \BadMethodCallException If the method called is an invalid find* or countBy method
* or no find* method at all and therefore an invalid * or no find* or countBy method at all and therefore an invalid
* method call. * method call.
*/ */
public function __call($method, $arguments) public function __call($method, $arguments)
@ -221,6 +237,11 @@ class EntityRepository implements ObjectRepository, Selectable
$method = 'findOneBy'; $method = 'findOneBy';
break; break;
case (0 === strpos($method, 'countBy')):
$by = substr($method, 7);
$method = 'count';
break;
default: default:
throw new \BadMethodCallException( throw new \BadMethodCallException(
"Undefined method '$method'. The method name must start with ". "Undefined method '$method'. The method name must start with ".
@ -228,14 +249,16 @@ class EntityRepository implements ObjectRepository, Selectable
); );
} }
if (empty($arguments)) { $argsCount = count($arguments);
if (0 === $argsCount) {
throw ORMException::findByRequiresParameter($method . $by); throw ORMException::findByRequiresParameter($method . $by);
} }
$fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by)); $fieldName = lcfirst(\Doctrine\Common\Util\Inflector::classify($by));
if ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName)) { if ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName)) {
switch (count($arguments)) { switch ($argsCount) {
case 1: case 1:
return $this->$method(array($fieldName => $arguments[0])); return $this->$method(array($fieldName => $arguments[0]));

View File

@ -822,7 +822,7 @@ class BasicEntityPersister implements EntityPersister
? $this->expandCriteriaParameters($criteria) ? $this->expandCriteriaParameters($criteria)
: $this->expandParameters($criteria); : $this->expandParameters($criteria);
return $this->conn->executeQuery($sql, $params, $types)->fetchColumn(); return (int) $this->conn->executeQuery($sql, $params, $types)->fetchColumn();
} }
/** /**

View File

@ -272,6 +272,30 @@ class EntityRepositoryTest extends OrmFunctionalTestCase
$this->assertEquals(4, count($users)); $this->assertEquals(4, count($users));
} }
public function testCount()
{
$this->loadFixture();
$repos = $this->_em->getRepository(CmsUser::class);
$userCount = $repos->count(array());
$this->assertSame(4, $userCount);
$userCount = $repos->count(array('status' => 'dev'));
$this->assertSame(2, $userCount);
$userCount = $repos->count(array('status' => 'nonexistent'));
$this->assertSame(0, $userCount);
}
public function testCountBy()
{
$this->loadFixture();
$repos = $this->_em->getRepository(CmsUser::class);
$userCount = $repos->countByStatus('dev');
$this->assertSame(2, $userCount);
}
/** /**
* @expectedException \Doctrine\ORM\ORMException * @expectedException \Doctrine\ORM\ORMException
*/ */