3 namespace Doctrine\Tests\ORM\Functional\Ticket;
5 require_once __DIR__ . '/../../../TestInit.php';
10 class DDC1163Test extends \Doctrine\Tests\OrmFunctionalTestCase
12 protected function setUp()
15 //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
16 $this->_schemaTool->createSchema(array(
17 $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1163Product'),
18 $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1163SpecialProduct'),
19 $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1163ProxyHolder'),
20 $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1163Tag'),
24 public function testIssue()
26 $this->createSpecialProductAndProxyHolderReferencingIt();
29 $this->createProxyForSpecialProduct();
31 $this->setPropertyAndAssignTagToSpecialProduct();
37 private function createSpecialProductAndProxyHolderReferencingIt()
39 $specialProduct = new DDC1163SpecialProduct();
40 $this->_em->persist($specialProduct);
42 $proxyHolder = new DDC1163ProxyHolder();
43 $this->_em->persist($proxyHolder);
45 $proxyHolder->setSpecialProduct($specialProduct);
49 $this->productId = $specialProduct->getId();
50 $this->proxyHolderId = $proxyHolder->getId();
54 * We want Doctrine to instantiate a lazy-load proxy for the previously created
55 * 'SpecialProduct' and register it.
57 * When Doctrine loads the 'ProxyHolder', it will do just that because the 'ProxyHolder'
58 * references the 'SpecialProduct'.
60 private function createProxyForSpecialProduct()
62 /* @var $proxyHolder ProxyHolder */
63 $proxyHolder = $this->_em->find(__NAMESPACE__ . '\\DDC1163ProxyHolder', $this->proxyHolderId);
65 $this->assertInstanceOf(__NAMESPACE__.'\\DDC1163SpecialProduct', $proxyHolder->getSpecialProduct());
68 private function setPropertyAndAssignTagToSpecialProduct()
70 /* @var $specialProduct SpecialProduct */
71 $specialProduct = $this->_em->find(__NAMESPACE__ . '\\DDC1163SpecialProduct', $this->productId);
73 $this->assertInstanceOf(__NAMESPACE__.'\\DDC1163SpecialProduct', $specialProduct);
74 $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $specialProduct);
76 $specialProduct->setSubclassProperty('foobar');
78 // this screams violation of law of demeter ;)
80 __NAMESPACE__.'\\DDC1163SpecialProduct',
81 $this->_em->getUnitOfWork()->getEntityPersister(get_class($specialProduct))->getClassMetadata()->name
84 $tag = new DDC1163Tag('Foo');
85 $this->_em->persist($tag);
86 $tag->setProduct($specialProduct);
93 class DDC1163ProxyHolder
98 * @Column(name="id", type="integer")
100 * @GeneratedValue(strategy="AUTO")
104 * @var SpecialProduct
105 * @OneToOne(targetEntity="DDC1163SpecialProduct")
107 private $specialProduct;
109 public function getId()
114 public function setSpecialProduct(DDC1163SpecialProduct $specialProduct)
116 $this->specialProduct = $specialProduct;
119 public function getSpecialProduct()
121 return $this->specialProduct;
128 * @InheritanceType("JOINED")
129 * @DiscriminatorColumn(name="type", type="string")
130 * @DiscriminatorMap({"special" = "DDC1163SpecialProduct"})
132 abstract class DDC1163Product
137 * @Column(name="id", type="integer")
139 * @GeneratedValue(strategy="AUTO")
143 public function getId()
153 class DDC1163SpecialProduct extends DDC1163Product
158 * @Column(name="subclass_property", type="string", nullable=true)
160 private $subclassProperty;
163 * @param string $value
165 public function setSubclassProperty($value)
167 $this->subclassProperty = $value;
180 * @Column(name="id", type="integer")
182 * @GeneratedValue(strategy="AUTO")
187 * @Column(name="name", type="string")
192 * @ManyToOne(targetEntity="DDC1163Product", inversedBy="tags")
194 * @JoinColumn(name="product_id", referencedColumnName="id")
200 * @param string $name
202 public function __construct($name)
208 * @param Product $product
210 public function setProduct(DDC1163Product $product)
212 $this->product = $product;