From 4890eca281bf45ae5e1e5e33f8ac9908e90ec85b Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 6 Jul 2015 22:07:54 +0200 Subject: [PATCH] Fixed the search engine for PostgreSQL databases --- Controller/AdminController.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Controller/AdminController.php b/Controller/AdminController.php index dd2e5c8e26..73db13cdbf 100644 --- a/Controller/AdminController.php +++ b/Controller/AdminController.php @@ -17,6 +17,7 @@ namespace JavierEguiluz\Bundle\EasyAdminBundle\Controller; +use Doctrine\DBAL\Platforms\PostgreSqlPlatform; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\ClassMetadataInfo; use Symfony\Component\EventDispatcher\GenericEvent; @@ -506,11 +507,17 @@ protected function findAll($entityClass, $page = 1, $maxPerPage = 15, $sortField */ protected function findBy($entityClass, $searchQuery, array $searchableFields, $page = 1, $maxPerPage = 15) { + $dbIsPostgreSql = $this->isPostgreSqlUsedByEntity($entityClass); $queryBuilder = $this->em->createQueryBuilder()->select('entity')->from($entityClass, 'entity'); $queryConditions = $queryBuilder->expr()->orX(); $queryParameters = array(); foreach ($searchableFields as $name => $metadata) { + // PostgreSQL doesn't allow to compare strings values with non-string columns (e.g. 'id') + if ($dbIsPostgreSql && !in_array($metadata['type'], array('text', 'string'))) { + continue; + } + if (in_array($metadata['dataType'], array('text', 'string'))) { $queryConditions->add(sprintf('entity.%s LIKE :query', $name)); $queryParameters['query'] = '%'.$searchQuery.'%'; @@ -697,4 +704,18 @@ public function renderCssAction() return $response; } + + /** + * Returns true if the data of the given entity are stored in a database + * of Type PostgreSQL. + * + * @param string $entityClass + * @return boolean + */ + private function isPostgreSqlUsedByEntity($entityClass) + { + $em = $this->get('doctrine')->getManagerForClass($entityClass); + + return $em->getConnection()->getDatabasePlatform() instanceof PostgreSqlPlatform; + } }