_schemaTool->createSchema(array( $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\CTIParent'), $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\CTIChild'), $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\CTIRelated'), $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\CTIRelated2') )); } catch (\Exception $ignored) { // Swallow all exceptions. We do not test the schema tool here. } } public function testOneToOneAssocToBaseTypeBidirectional() { $child = new CTIChild; $child->setData('hello'); $related = new CTIRelated; $related->setCTIParent($child); $this->_em->persist($related); $this->_em->persist($child); $this->_em->flush(); $this->_em->clear(); $relatedId = $related->getId(); $related2 = $this->_em->find('Doctrine\Tests\ORM\Functional\CTIRelated', $relatedId); $this->assertInstanceOf('Doctrine\Tests\ORM\Functional\CTIRelated', $related2); $this->assertInstanceOf('Doctrine\Tests\ORM\Functional\CTIChild', $related2->getCTIParent()); $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $related2->getCTIParent()); $this->assertEquals('hello', $related2->getCTIParent()->getData()); $this->assertSame($related2, $related2->getCTIParent()->getRelated()); } public function testManyToManyToCTIHierarchy() { //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); $mmrel = new CTIRelated2; $child = new CTIChild; $child->setData('child'); $mmrel->addCTIChild($child); $this->_em->persist($mmrel); $this->_em->persist($child); $this->_em->flush(); $this->_em->clear(); $mmrel2 = $this->_em->find(get_class($mmrel), $mmrel->getId()); $this->assertFalse($mmrel2->getCTIChildren()->isInitialized()); $this->assertEquals(1, count($mmrel2->getCTIChildren())); $this->assertTrue($mmrel2->getCTIChildren()->isInitialized()); $this->assertInstanceOf('Doctrine\Tests\ORM\Functional\CTIChild', $mmrel2->getCTIChildren()->get(0)); } } /** * @Entity @Table(name="cti_parents") * @InheritanceType("JOINED") * @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"parent" = "CTIParent", "child" = "CTIChild"}) */ class CTIParent { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** @OneToOne(targetEntity="CTIRelated", mappedBy="ctiParent") */ private $related; public function getId() { return $this->id; } public function getRelated() { return $this->related; } public function setRelated($related) { $this->related = $related; $related->setCTIParent($this); } } /** * @Entity @Table(name="cti_children") */ class CTIChild extends CTIParent { /** * @Column(type="string") */ private $data; public function getData() { return $this->data; } public function setData($data) { $this->data = $data; } } /** @Entity */ class CTIRelated { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** * @OneToOne(targetEntity="CTIParent") * @JoinColumn(name="ctiparent_id", referencedColumnName="id") */ private $ctiParent; public function getId() { return $this->id; } public function getCTIParent() { return $this->ctiParent; } public function setCTIParent($ctiParent) { $this->ctiParent = $ctiParent; } } /** @Entity */ class CTIRelated2 { /** @Id @Column(type="integer") @GeneratedValue */ private $id; /** @ManyToMany(targetEntity="CTIChild") */ private $ctiChildren; public function __construct() { $this->ctiChildren = new \Doctrine\Common\Collections\ArrayCollection; } public function getId() { return $this->id; } public function addCTIChild(CTIChild $child) { $this->ctiChildren->add($child); } public function getCTIChildren() { return $this->ctiChildren; } }