useModelSet('ecommerce'); parent::setUp(); $this->product = new ECommerceProduct(); $this->product->setName('Doctrine Cookbook'); $this->firstFeature = new ECommerceFeature(); $this->firstFeature->setDescription('Model writing tutorial'); $this->secondFeature = new ECommerceFeature(); $this->secondFeature->setDescription('Annotations examples'); } public function testSavesAOneToManyAssociationWithCascadeSaveSet() { $this->product->addFeature($this->firstFeature); $this->product->addFeature($this->secondFeature); $this->_em->persist($this->product); $this->_em->flush(); $this->assertFeatureForeignKeyIs($this->product->getId(), $this->firstFeature); $this->assertFeatureForeignKeyIs($this->product->getId(), $this->secondFeature); } public function testSavesAnEmptyCollection() { $this->_em->persist($this->product); $this->_em->flush(); $this->assertEquals(0, count($this->product->getFeatures())); } public function testDoesNotSaveAnInverseSideSet() { $this->product->brokenAddFeature($this->firstFeature); $this->_em->persist($this->product); $this->_em->flush(); $this->assertFeatureForeignKeyIs(null, $this->firstFeature); } public function testRemovesOneToOneAssociation() { $this->product->addFeature($this->firstFeature); $this->product->addFeature($this->secondFeature); $this->_em->persist($this->product); $this->product->removeFeature($this->firstFeature); $this->_em->flush(); $this->assertFeatureForeignKeyIs(null, $this->firstFeature); $this->assertFeatureForeignKeyIs($this->product->getId(), $this->secondFeature); } public function testEagerLoadsOneToManyAssociation() { $this->_createFixture(); $query = $this->_em->createQuery('select p, f from Doctrine\Tests\Models\ECommerce\ECommerceProduct p join p.features f'); $result = $query->getResult(); $product = $result[0]; $features = $product->getFeatures(); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $features[0]); $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $features[0]->getProduct()); $this->assertSame($product, $features[0]->getProduct()); $this->assertEquals('Model writing tutorial', $features[0]->getDescription()); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $features[1]); $this->assertSame($product, $features[1]->getProduct()); $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $features[1]->getProduct()); $this->assertEquals('Annotations examples', $features[1]->getDescription()); } public function testLazyLoadsObjectsOnTheOwningSide() { $this->_createFixture(); $query = $this->_em->createQuery('select p from Doctrine\Tests\Models\ECommerce\ECommerceProduct p'); $result = $query->getResult(); $product = $result[0]; $features = $product->getFeatures(); $this->assertFalse($features->isInitialized()); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $features[0]); $this->assertTrue($features->isInitialized()); $this->assertSame($product, $features[0]->getProduct()); $this->assertEquals('Model writing tutorial', $features[0]->getDescription()); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $features[1]); $this->assertSame($product, $features[1]->getProduct()); $this->assertEquals('Annotations examples', $features[1]->getDescription()); } public function testLazyLoadsObjectsOnTheInverseSide() { $this->_createFixture(); $query = $this->_em->createQuery('select f from Doctrine\Tests\Models\ECommerce\ECommerceFeature f'); $features = $query->getResult(); $product = $features[0]->getProduct(); $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $product); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $product); $this->assertFalse($product->__isInitialized__); $this->assertSame('Doctrine Cookbook', $product->getName()); $this->assertTrue($product->__isInitialized__); } public function testLazyLoadsObjectsOnTheInverseSide2() { //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); $this->_createFixture(); $query = $this->_em->createQuery('select f,p from Doctrine\Tests\Models\ECommerce\ECommerceFeature f join f.product p'); $features = $query->getResult(); $product = $features[0]->getProduct(); $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $product); $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $product); $this->assertSame('Doctrine Cookbook', $product->getName()); $this->assertFalse($product->getFeatures()->isInitialized()); // This would trigger lazy-load //$this->assertEquals(2, $product->getFeatures()->count()); //$this->assertTrue($product->getFeatures()->contains($features[0])); //$this->assertTrue($product->getFeatures()->contains($features[1])); //$this->_em->getConnection()->getConfiguration()->setSQLLogger(null); } public function testJoinFromOwningSide() { $query = $this->_em->createQuery('select f,p from Doctrine\Tests\Models\ECommerce\ECommerceFeature f join f.product p'); $features = $query->getResult(); $this->assertEquals(0, count($features)); } private function _createFixture() { $this->product->addFeature($this->firstFeature); $this->product->addFeature($this->secondFeature); $this->_em->persist($this->product); $this->_em->flush(); $this->_em->clear(); } public function assertFeatureForeignKeyIs($value, ECommerceFeature $feature) { $foreignKey = $this->_em->getConnection()->executeQuery( 'SELECT product_id FROM ecommerce_features WHERE id=?', array($feature->getId()) )->fetchColumn(); $this->assertEquals($value, $foreignKey); } }