From ae5487123ea7558fd788e3796cac80db490af903 Mon Sep 17 00:00:00 2001 From: dantleech Date: Mon, 7 Apr 2014 22:54:50 +0200 Subject: [PATCH] Supported for using referrer fields in queries --- .../Query/Builder/BuilderConverterPhpcr.php | 14 +++++++- .../Doctrine/Tests/Models/CMS/CmsAddress.php | 5 +++ .../PHPCR/Functional/QueryBuilderJoinTest.php | 35 ++++++++++--------- .../Builder/BuilderConverterPhpcrTest.php | 3 ++ 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/lib/Doctrine/ODM/PHPCR/Query/Builder/BuilderConverterPhpcr.php b/lib/Doctrine/ODM/PHPCR/Query/Builder/BuilderConverterPhpcr.php index 1e39f49ec..51cb75245 100644 --- a/lib/Doctrine/ODM/PHPCR/Query/Builder/BuilderConverterPhpcr.php +++ b/lib/Doctrine/ODM/PHPCR/Query/Builder/BuilderConverterPhpcr.php @@ -122,7 +122,19 @@ protected function getMetadata($alias) */ protected function getPhpcrProperty($originalAlias, $odmField) { - $fieldMeta = $this->getMetadata($originalAlias)->getField($odmField); + $meta = $this->getMetadata($originalAlias); + + if ($meta->hasField($odmField)) { + $fieldMeta = $meta->getField($odmField); + } elseif ($meta->hasAssociation($odmField)) { + $fieldMeta = $meta->getAssociation($odmField); + } else { + throw new \Exception(sprintf( + 'Could not find a mapped field or association named "%s" for alias "%s"', + $odmField, $originalAlias + )); + } + $propertyName = $fieldMeta['property']; if (empty($fieldMeta['translated']) diff --git a/tests/Doctrine/Tests/Models/CMS/CmsAddress.php b/tests/Doctrine/Tests/Models/CMS/CmsAddress.php index 816ff0f35..177bde0e6 100644 --- a/tests/Doctrine/Tests/Models/CMS/CmsAddress.php +++ b/tests/Doctrine/Tests/Models/CMS/CmsAddress.php @@ -28,6 +28,11 @@ class CmsAddress /** @PHPCRODM\ReferenceOne(targetDocument="CmsUser") */ public $user; + /** + * @PHPCRODM\Uuid + */ + public $uuid; + public function getId() { return $this->id; diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Functional/QueryBuilderJoinTest.php b/tests/Doctrine/Tests/ODM/PHPCR/Functional/QueryBuilderJoinTest.php index 10bf2aacf..e285156d9 100644 --- a/tests/Doctrine/Tests/ODM/PHPCR/Functional/QueryBuilderJoinTest.php +++ b/tests/Doctrine/Tests/ODM/PHPCR/Functional/QueryBuilderJoinTest.php @@ -23,19 +23,26 @@ public function setUp() $this->resetFunctionalNode($this->dm); - $address = new CmsAddress; - $address->country = 'France'; - $address->city = 'Lyon'; - $address->zip = '65019'; - $this->dm->persist($address); + $address1 = new CmsAddress; + $address1->country = 'France'; + $address1->city = 'Lyon'; + $address1->zip = '65019'; + $this->dm->persist($address1); + + $address2 = new CmsAddress; + $address2->country = 'England'; + $address2->city = 'Weymouth'; + $address2->zip = 'AB1DC2'; + $this->dm->persist($address2); $user = new CmsUser; $user->username = 'dantleech'; - $user->address = $address; + $user->address = $address1; $this->dm->persist($user); $user = new CmsUser; $user->username = 'winstonsmith'; + $user->address = $address2; $this->dm->persist($user); $user = new CmsUser; @@ -53,10 +60,6 @@ public function setUp() $this->dm->flush(); } - /** - * This doesn't work -- I didn't really expect it to, but is it possible - * to join a reference? - */ public function testEquiJoinInnerOnReference() { $qb = $this->dm->createQueryBuilder(); @@ -64,12 +67,12 @@ public function testEquiJoinInnerOnReference() $qb->addJoinInner() ->right()->document('Doctrine\Tests\Models\CMS\CmsAddress', 'a')->end() ->condition()->equi('u.address', 'a.uuid'); - try { - $q = $qb->getQuery(); - $res = $q->execute(); - } catch (\Exception $e) { - $this->markTestSkipped('How do we join a reference? Exception: '.$e->getMessage()); - } + $qb->where()->eq()->field('a.city')->literal('Lyon'); + $q = $qb->getQuery(); + $res = $q->execute(); + + $this->assertCount(1, $res); + $this->assertEquals('dantleech', $res->current()->username); } public function provideEquiJoinInner() diff --git a/tests/Doctrine/Tests/ODM/PHPCR/Query/Builder/BuilderConverterPhpcrTest.php b/tests/Doctrine/Tests/ODM/PHPCR/Query/Builder/BuilderConverterPhpcrTest.php index 2d4ddbd2b..159abe30e 100644 --- a/tests/Doctrine/Tests/ODM/PHPCR/Query/Builder/BuilderConverterPhpcrTest.php +++ b/tests/Doctrine/Tests/ODM/PHPCR/Query/Builder/BuilderConverterPhpcrTest.php @@ -39,6 +39,9 @@ public function setUp() return $meta; } + $meta->expects($me->any()) + ->method('hasField') + ->will($me->returnValue(true)); $meta->expects($me->any()) ->method('getField')