From af2295b73aae83aca5047403cdb6c3e7f4bc32c2 Mon Sep 17 00:00:00 2001 From: Wojciech Zylinski Date: Sun, 3 May 2015 18:39:51 +0100 Subject: [PATCH 1/3] Switch to relationToTargetKeyColumns when matching non-owning side with Criteria. Fixes DDC-3719. --- .../Collection/ManyToManyPersister.php | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php index bf9f14e68..6b5dd554e 100644 --- a/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php @@ -229,29 +229,41 @@ class ManyToManyPersister extends AbstractCollectionPersister $mapping = $collection->getMapping(); $owner = $collection->getOwner(); $ownerMetadata = $this->em->getClassMetadata(get_class($owner)); + $id = $this->uow->getEntityIdentifier($owner); + $targetClass = $this->em->getClassMetadata($mapping['targetEntity']); + $onConditions = $this->getOnConditionSQL($mapping); $whereClauses = $params = array(); - foreach ($mapping['relationToSourceKeyColumns'] as $key => $value) { + if ( ! $mapping['isOwningSide']) { + $associationSourceClass = $targetClass; + $mapping = $targetClass->associationMappings[$mapping['mappedBy']]; + $sourceRelationMode = 'relationToTargetKeyColumns'; + } else { + $associationSourceClass = $ownerMetadata; + $sourceRelationMode = 'relationToSourceKeyColumns'; + } + + foreach ($mapping[$sourceRelationMode] as $key => $value) { $whereClauses[] = sprintf('t.%s = ?', $key); - $params[] = $ownerMetadata->getFieldValue($owner, $value); + $params[] = $ownerMetadata->containsForeignIdentifier + ? $id[$ownerMetadata->getFieldForColumn($value)] + : $id[$ownerMetadata->fieldNames[$value]]; } $parameters = $this->expandCriteriaParameters($criteria); foreach ($parameters as $parameter) { list($name, $value) = $parameter; - $whereClauses[] = sprintf('te.%s = ?', $name); + $field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform); + $whereClauses[] = sprintf('te.%s = ?', $field); $params[] = $value; } - $mapping = $collection->getMapping(); - $targetClass = $this->em->getClassMetadata($mapping['targetEntity']); $tableName = $this->quoteStrategy->getTableName($targetClass, $this->platform); - $joinTable = $this->quoteStrategy->getJoinTableName($mapping, $ownerMetadata, $this->platform); - $onConditions = $this->getOnConditionSQL($mapping); + $joinTable = $this->quoteStrategy->getJoinTableName($mapping, $associationSourceClass, $this->platform); $rsm = new Query\ResultSetMappingBuilder($this->em); - $rsm->addRootEntityFromClassMetadata($mapping['targetEntity'], 'te'); + $rsm->addRootEntityFromClassMetadata($targetClass->name, 'te'); $sql = 'SELECT ' . $rsm->generateSelectClause() . ' FROM ' . $tableName . ' te' From 375b0369ae7b3343fb62bb5558584a2b447fee04 Mon Sep 17 00:00:00 2001 From: Jean Carlo Machado Date: Thu, 28 Jan 2016 19:36:52 -0200 Subject: [PATCH 2/3] added test of matching non-owing side with criteria --- .../ORM/Functional/Ticket/DDC3719Test.php | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php new file mode 100644 index 000000000..28e65b32e --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php @@ -0,0 +1,54 @@ + + */ +class DDC3719Test extends \Doctrine\Tests\OrmFunctionalTestCase +{ + public function setUp() + { + $this->useModelSet('company'); + parent::setUp(); + } + + /** + * @group DDC-3719 + */ + public function testCriteriaOnNotOwningSide() + { + $manager = new CompanyManager(); + $manager->setName('Gandalf'); + $manager->setSalary(666); + $manager->setTitle('Boss'); + $manager->setDepartment('Marketing'); + $this->_em->persist($manager); + + $contractA = new CompanyFlexContract(); + $contractA->markCompleted(); + $contractA->addManager($manager); + $this->_em->persist($contractA); + + $contractB = new CompanyFlexContract(); + $contractB->addManager($manager); + $this->_em->persist($contractB); + + $this->_em->flush(); + $this->_em->refresh($manager); + + $contracts = $manager->managedContracts; + static::assertCount(2, $contracts); + + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq("completed", true)); + + $completedContracts = $contracts->matching($criteria); + static::assertCount(1, $completedContracts); + } +} From 468fe315bae21999ff4d85022f70c091d141a0a5 Mon Sep 17 00:00:00 2001 From: Jean Carlo Machado Date: Fri, 29 Jan 2016 10:03:44 -0200 Subject: [PATCH 3/3] fixed indentation --- .../ORM/Functional/Ticket/DDC3719Test.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php index 28e65b32e..f5f60c0b0 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3719Test.php @@ -24,10 +24,10 @@ class DDC3719Test extends \Doctrine\Tests\OrmFunctionalTestCase public function testCriteriaOnNotOwningSide() { $manager = new CompanyManager(); - $manager->setName('Gandalf'); - $manager->setSalary(666); - $manager->setTitle('Boss'); - $manager->setDepartment('Marketing'); + $manager->setName('Gandalf'); + $manager->setSalary(666); + $manager->setTitle('Boss'); + $manager->setDepartment('Marketing'); $this->_em->persist($manager); $contractA = new CompanyFlexContract(); @@ -43,12 +43,12 @@ class DDC3719Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->refresh($manager); $contracts = $manager->managedContracts; - static::assertCount(2, $contracts); + static::assertCount(2, $contracts); - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq("completed", true)); + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq("completed", true)); - $completedContracts = $contracts->matching($criteria); - static::assertCount(1, $completedContracts); + $completedContracts = $contracts->matching($criteria); + static::assertCount(1, $completedContracts); } }