Доктрина: подсчет объектов сущностей с условием
Как я могу подсчитать объекты сущностей с условием в Доктрине? Например, я понимаю, что могу использовать:
$usersCount = $dm->getRepository('User')->count();
Но это будет учитывать только всех пользователей. Я хотел бы считать только те, у кого есть сотрудник типа. Я мог бы сделать что-то вроде:
$users = $dm->getRepository('User')->findBy(array('type' => 'employee'));
$users = count($users);
Это работает, но это не оптимально. Есть ли что-то вроде следующего:?
$usersCount = $dm->getRepository('User')->count()->where('type', 'employee');
Ответы
Ответ 1
Ну, вы можете использовать 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')
или независимо от того, что вы вызываете ваше поле первичного ключа.
Ответ 2
Этот вопрос составляет 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->count($criteria);