select("PARTIAL s.{id,email,firstName,lastName,status,createdAt}"); } protected function applyFromClause(QueryBuilder $queryBuilder) { $queryBuilder->from(SubscriberEntity::class, 's'); } protected function applyGroup(QueryBuilder $queryBuilder, string $group) { // include/exclude deleted if ($group === 'trash') { $queryBuilder->andWhere('s.deletedAt IS NOT NULL'); } else { $queryBuilder->andWhere('s.deletedAt IS NULL'); } if (!in_array($group, self::$supportedStatuses)) { return; } $queryBuilder ->andWhere('s.status = :status') ->setParameter('status', $group); } protected function applySearch(QueryBuilder $queryBuilder, string $search) { $search = str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $search); // escape for 'LIKE' $queryBuilder ->andWhere('s.subject LIKE :search') ->setParameter('search', "%$search%"); } protected function applyFilters(QueryBuilder $queryBuilder, array $filters) { // this is done in a different level } protected function applyParameters(QueryBuilder $queryBuilder, array $parameters) { // nothing to do here } protected function applySorting(QueryBuilder $queryBuilder, string $sortBy, string $sortOrder) { $queryBuilder->addOrderBy("s.$sortBy", $sortOrder); } }