From 2b7b0c8ef6fb0cb3f55224ede42016e7946caa94 Mon Sep 17 00:00:00 2001 From: Jan Skrasek Date: Sat, 10 Oct 2015 21:48:20 +0200 Subject: [PATCH] collection: implemented mapping & modifiers support [closes #117] --- src/Mapper/Dbal/QueryBuilderHelper.php | 15 +++++++++++---- .../cases/integration/Collection/collection.phpt | 11 +++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Mapper/Dbal/QueryBuilderHelper.php b/src/Mapper/Dbal/QueryBuilderHelper.php index e4d04416..cbf15544 100644 --- a/src/Mapper/Dbal/QueryBuilderHelper.php +++ b/src/Mapper/Dbal/QueryBuilderHelper.php @@ -66,10 +66,11 @@ public function processWhereExpression($expression, $value, QueryBuilder $builde return; } - $sqlExpresssion = $this->normalizeAndAddJoins($chain, $sourceEntity, $builder, $distinctNeeded, $value); + $modifier = '%any'; + $sqlExpresssion = $this->normalizeAndAddJoins($chain, $sourceEntity, $builder, $distinctNeeded, $value, $modifier); $operator = $this->getSqlOperator($value, $operator); - $builder->andWhere($sqlExpresssion . $operator . '%any', $value); + $builder->andWhere($sqlExpresssion . $operator . $modifier, $value); } @@ -91,7 +92,7 @@ public function processOrderByExpression($expression, $direction, QueryBuilder $ } - private function normalizeAndAddJoins(array $levels, $sourceEntity, QueryBuilder $builder, & $distinctNeeded = FALSE, & $value = NULL) + private function normalizeAndAddJoins(array $levels, $sourceEntity, QueryBuilder $builder, & $distinctNeeded = FALSE, & $value = NULL, & $modifier = '%any') { $column = array_pop($levels); $sourceMapper = $this->mapper; @@ -171,7 +172,13 @@ private function normalizeAndAddJoins(array $levels, $sourceEntity, QueryBuilder return '(' . implode(', ', $pair) . ')'; } else { - $column = $sourceReflection->convertEntityToStorageKey($column); + $converted = $sourceReflection->convertEntityToStorage([$column => $value]); + $column = key($converted); + if (($pos = strpos($column, '%')) !== FALSE) { + $column = substr($column, 0, $pos); + $modifier = substr($column, $pos); + } + $value = current($converted); return "[{$sourceAlias}.{$column}]"; } } diff --git a/tests/cases/integration/Collection/collection.phpt b/tests/cases/integration/Collection/collection.phpt index 8f1982eb..8edee451 100644 --- a/tests/cases/integration/Collection/collection.phpt +++ b/tests/cases/integration/Collection/collection.phpt @@ -13,6 +13,8 @@ use NextrasTests\Orm\Book; use NextrasTests\Orm\DataTestCase; use NextrasTests\Orm\TagFollower; use Tester\Assert; +use Tester\Environment; + $dic = require_once __DIR__ . '/../../../bootstrap.php'; @@ -144,6 +146,15 @@ class CollectionTest extends DataTestCase Assert::same(1, $follower->author->id); } + + public function testMappingInCollection() + { + if ($this->section === 'array') Environment::skip('Test is only for Dbal mapper.'); + + $tags = $this->orm->tags->findBy(['isGlobal' => TRUE]); + Assert::same(2, $tags->countStored()); + Assert::same('Tag 1', $tags->fetch()->name); + } }