2009-11-03 18:30:21 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Doctrine\Tests\ORM\Functional;
|
2016-05-11 02:41:26 +07:00
|
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
2016-12-08 18:01:04 +01:00
|
|
|
use Doctrine\ORM\Proxy\Proxy;
|
2016-05-11 02:41:26 +07:00
|
|
|
use Doctrine\Tests\OrmFunctionalTestCase;
|
2009-11-03 18:30:21 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Functional tests for the Class Table Inheritance mapping strategy.
|
|
|
|
*
|
|
|
|
* @author robo
|
|
|
|
*/
|
2016-05-11 02:41:26 +07:00
|
|
|
class ClassTableInheritanceTest2 extends OrmFunctionalTestCase
|
2009-11-03 18:30:21 +00:00
|
|
|
{
|
2016-05-11 02:41:26 +07:00
|
|
|
protected function setUp()
|
|
|
|
{
|
2009-11-03 18:30:21 +00:00
|
|
|
parent::setUp();
|
|
|
|
try {
|
2016-12-07 23:33:41 +01:00
|
|
|
$this->_schemaTool->createSchema(
|
|
|
|
[
|
2016-12-08 18:01:04 +01:00
|
|
|
$this->_em->getClassMetadata(CTIParent::class),
|
|
|
|
$this->_em->getClassMetadata(CTIChild::class),
|
|
|
|
$this->_em->getClassMetadata(CTIRelated::class),
|
|
|
|
$this->_em->getClassMetadata(CTIRelated2::class)
|
2016-12-07 23:33:41 +01:00
|
|
|
]
|
|
|
|
);
|
2010-04-26 13:02:30 +02:00
|
|
|
} catch (\Exception $ignored) {
|
2009-11-03 18:30:21 +00:00
|
|
|
// Swallow all exceptions. We do not test the schema tool here.
|
|
|
|
}
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function testOneToOneAssocToBaseTypeBidirectional()
|
|
|
|
{
|
|
|
|
$child = new CTIChild;
|
|
|
|
$child->setData('hello');
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
$related = new CTIRelated;
|
|
|
|
$related->setCTIParent($child);
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
$this->_em->persist($related);
|
|
|
|
$this->_em->persist($child);
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
$this->_em->flush();
|
|
|
|
$this->_em->clear();
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
$relatedId = $related->getId();
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2016-12-08 18:01:04 +01:00
|
|
|
$related2 = $this->_em->find(CTIRelated::class, $relatedId);
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2016-12-08 18:01:04 +01:00
|
|
|
$this->assertInstanceOf(CTIRelated::class, $related2);
|
|
|
|
$this->assertInstanceOf(CTIChild::class, $related2->getCTIParent());
|
|
|
|
$this->assertNotInstanceOf(Proxy::class, $related2->getCTIParent());
|
2009-11-03 18:30:21 +00:00
|
|
|
$this->assertEquals('hello', $related2->getCTIParent()->getData());
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
$this->assertSame($related2, $related2->getCTIParent()->getRelated());
|
|
|
|
}
|
2010-04-26 13:02:30 +02:00
|
|
|
|
|
|
|
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());
|
2016-12-08 18:01:04 +01:00
|
|
|
$this->assertInstanceOf(CTIChild::class, $mmrel2->getCTIChildren()->get(0));
|
2010-04-26 13:02:30 +02:00
|
|
|
}
|
2009-11-03 18:30:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @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;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
/** @OneToOne(targetEntity="CTIRelated", mappedBy="ctiParent") */
|
|
|
|
private $related;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function getId() {
|
|
|
|
return $this->id;
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function getRelated() {
|
|
|
|
return $this->related;
|
2011-12-19 22:56:19 +01:00
|
|
|
}
|
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function setRelated($related) {
|
|
|
|
$this->related = $related;
|
|
|
|
$related->setCTIParent($this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @Entity @Table(name="cti_children")
|
|
|
|
*/
|
|
|
|
class CTIChild extends CTIParent {
|
|
|
|
/**
|
|
|
|
* @Column(type="string")
|
|
|
|
*/
|
|
|
|
private $data;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function getData() {
|
|
|
|
return $this->data;
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function setData($data) {
|
|
|
|
$this->data = $data;
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/** @Entity */
|
|
|
|
class CTIRelated {
|
|
|
|
/**
|
|
|
|
* @Id @Column(type="integer")
|
|
|
|
* @GeneratedValue(strategy="AUTO")
|
|
|
|
*/
|
|
|
|
private $id;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
/**
|
|
|
|
* @OneToOne(targetEntity="CTIParent")
|
|
|
|
* @JoinColumn(name="ctiparent_id", referencedColumnName="id")
|
|
|
|
*/
|
|
|
|
private $ctiParent;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function getId() {
|
|
|
|
return $this->id;
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function getCTIParent() {
|
|
|
|
return $this->ctiParent;
|
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2009-11-03 18:30:21 +00:00
|
|
|
public function setCTIParent($ctiParent) {
|
|
|
|
$this->ctiParent = $ctiParent;
|
|
|
|
}
|
|
|
|
}
|
2010-04-26 13:02:30 +02:00
|
|
|
|
|
|
|
/** @Entity */
|
|
|
|
class CTIRelated2
|
|
|
|
{
|
|
|
|
/** @Id @Column(type="integer") @GeneratedValue */
|
|
|
|
private $id;
|
|
|
|
/** @ManyToMany(targetEntity="CTIChild") */
|
|
|
|
private $ctiChildren;
|
|
|
|
|
|
|
|
|
2016-05-11 02:41:26 +07:00
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->ctiChildren = new ArrayCollection();
|
2010-04-26 13:02:30 +02:00
|
|
|
}
|
|
|
|
|
2016-05-11 02:41:26 +07:00
|
|
|
public function getId()
|
|
|
|
{
|
2010-04-26 13:02:30 +02:00
|
|
|
return $this->id;
|
|
|
|
}
|
|
|
|
|
2016-05-11 02:41:26 +07:00
|
|
|
public function addCTIChild(CTIChild $child)
|
|
|
|
{
|
2010-04-26 13:02:30 +02:00
|
|
|
$this->ctiChildren->add($child);
|
|
|
|
}
|
|
|
|
|
2016-05-11 02:41:26 +07:00
|
|
|
public function getCTIChildren()
|
|
|
|
{
|
2010-04-26 13:02:30 +02:00
|
|
|
return $this->ctiChildren;
|
|
|
|
}
|
|
|
|
}
|