public function getCollection(array $criteria, array $orderBy, $limit = null, $offset = null)
{
$qb = $this->getRepository()->createQueryBuilder('u');
$qb->setFirstResult($offset);
$qb->setMaxResults($limit);
if (!empty($criteria['q'])) {
$q = $qb->expr()->literal('%' . $criteria['q'] . '%');
$qb->andWhere($qb->expr()->orX($qb->expr()->like('u.username', $q), $qb->expr()->like('u.email', $q)));
}
if (!empty($criteria['groups'])) {
$qb->join('u.groups', 'g', 'WITH', 'g.id = :group')->setParameter('group', $criteria['groups']);
}
if (isset($criteria['status'])) {
$qb->andWhere('u.status = :status')->setParameter('status', $criteria['status']);
}
if (isset($criteria['attribute']) && is_array($criteria['attribute'])) {
foreach ($criteria['attribute'] as $attribute => $value) {
$qb->join('u.attributes', 'a', 'WITH', 'a.attribute = :attribute AND a.value = :value');
$qb->setParameter('attribute', $attribute);
$qb->setParameter('value', $value);
break;
// only 1
}
}
foreach ($orderBy as $column => $dir) {
$qb->addOrderBy("u.{$column}", $dir);
}
return new PaginatedCollection($qb->getQuery());
}