web-dev-qa-db-ja.com

Doctrine:条件付きでエンティティのアイテムを数える

Doctrineの条件でエンティティのアイテムをどのように数えることができますか?たとえば、私は私が使用できることを認識しています:

$usersCount = $dm->getRepository('User')->count();

しかし、それはすべてのユーザーを数えるだけです。タイプが従業員の人だけを数えたいと思います。私は次のようなことをすることができます:

$users = $dm->getRepository('User')->findBy(array('type' => 'employee'));
$users = count($users);

それは機能しますが、最適ではありません。次のようなものはありますか?

$usersCount = $dm->getRepository('User')->count()->where('type', 'employee');
22
luqita

QueryBuilder を使用してCOUNTクエリを設定できます。

_$dm_がエンティティマネージャーであると仮定します

_$qb = $dm->createQueryBuilder();

$qb->select($qb->expr()->count('u'))
   ->from('User', 'u')
   ->where('u.type = ?1')
   ->setParameter(1, 'employee');

$query = $qb->getQuery();

$usersCount = $query->getSingleScalarResult();
_

または [〜#〜] dql [〜#〜]

_$query = $dm->createQuery("SELECT COUNT(u) FROM User u WHERE u.type = ?1");
$query->setParameter(1, 'employee');

$usersCount = $query->getSingleScalarResult();
_

カウントは、オブジェクトではなくidフィールドにある必要がある場合があり、リコールできません。その場合は、COUNT(u)または->count('u')COUNT(u.id)または->count('u.id')または主キーフィールドが呼び出されるものに変更します。

22
Orbling

この質問は3年前のものですが、条件付きのカウントでfindBy()の単純さを保つ方法があります。

リポジトリにこのメソッドを追加できます:

    public function countBy(array $criteria)
    {
        $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
        return $persister->count($criteria);
    }

したがって、コードは次のようになります。

$criteria = ['type' => 'employee'];
$users = $repository->findBy($criteria, ['name' => 'ASC'], 0, 20);
$nbUsers = $repository->countBy($criteria);
14
Bacteries