* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ namespace PrestaShop\PrestaShop\Core\Grid\Query; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Query\QueryBuilder; use PrestaShop\PrestaShop\Core\Grid\Search\SearchCriteriaInterface; /** * Class EmailLogsQueryBuilder is responsible for building queries for email logs grid data. */ final class EmailLogsQueryBuilder extends AbstractDoctrineQueryBuilder { /** * @var DoctrineSearchCriteriaApplicatorInterface */ private $searchCriteriaApplicator; /** * @param Connection $connection * @param string $dbPrefix * @param DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator */ public function __construct( Connection $connection, $dbPrefix, DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator ) { parent::__construct($connection, $dbPrefix); $this->searchCriteriaApplicator = $searchCriteriaApplicator; } /** * {@inheritdoc} */ public function getSearchQueryBuilder(SearchCriteriaInterface $searchCriteria) { $qb = $this->getQueryBuilder($searchCriteria->getFilters()); $qb->select('m.*, l.name AS language'); $this->searchCriteriaApplicator ->applySorting($searchCriteria, $qb) ->applyPagination($searchCriteria, $qb); return $qb; } /** * {@inheritdoc} */ public function getCountQueryBuilder(SearchCriteriaInterface $searchCriteria) { $qb = $this->getQueryBuilder($searchCriteria->getFilters()); $qb->select('COUNT(m.id_mail)'); return $qb; } /** * Get generic query builder. * * @param array $filters * * @return QueryBuilder */ private function getQueryBuilder(array $filters) { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'mail', 'm') ->leftJoin('m', $this->dbPrefix . 'lang', 'l', 'm.id_lang = l.id_lang'); foreach ($filters as $name => $value) { if ('id_lang' === $name) { $qb->andWhere("l.id_lang = :$name"); $qb->setParameter($name, $value); continue; } if ('date_add' === $name) { if (isset($value['from'])) { $qb->andWhere('m.date_add >= :date_from'); $qb->setParameter('date_from', sprintf('%s %s', $value['from'], '0:0:0')); } if (isset($value['to'])) { $qb->andWhere('m.date_add <= :date_to'); $qb->setParameter('date_to', sprintf('%s %s', $value['to'], '23:59:59')); } continue; } $qb->andWhere("$name LIKE :$name"); $qb->setParameter($name, '%' . $value . '%'); } return $qb; } }