DDC1335Test.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace Doctrine\Tests\ORM\Functional\Ticket;
  3. use DateTime;
  4. require_once __DIR__ . '/../../../TestInit.php';
  5. /**
  6. * @group DDC-1335
  7. */
  8. class DDC1335Test extends \Doctrine\Tests\OrmFunctionalTestCase
  9. {
  10. protected function setUp()
  11. {
  12. parent::setUp();
  13. try {
  14. $this->_schemaTool->createSchema(array(
  15. $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1335User'),
  16. $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1335Phone'),
  17. ));
  18. $this->loadFixture();
  19. } catch(\Exception $e) {
  20. }
  21. }
  22. public function testDql()
  23. {
  24. $dql = 'SELECT u FROM ' . __NAMESPACE__ . '\DDC1335User u INDEX BY u.id';
  25. $query = $this->_em->createQuery($dql);
  26. $result = $query->getResult();
  27. $this->assertEquals(sizeof($result), 3);
  28. $this->assertArrayHasKey(1, $result);
  29. $this->assertArrayHasKey(2, $result);
  30. $this->assertArrayHasKey(3, $result);
  31. $dql = 'SELECT u, p FROM '.__NAMESPACE__ . '\DDC1335User u INDEX BY u.email INNER JOIN u.phones p INDEX BY p.id';
  32. $query = $this->_em->createQuery($dql);
  33. $result = $query->getResult();
  34. $this->assertEquals(sizeof($result), 3);
  35. $this->assertArrayHasKey('foo@foo.com', $result);
  36. $this->assertArrayHasKey('bar@bar.com', $result);
  37. $this->assertArrayHasKey('foobar@foobar.com', $result);
  38. $this->assertEquals(sizeof($result['foo@foo.com']->phones), 3);
  39. $this->assertEquals(sizeof($result['bar@bar.com']->phones), 3);
  40. $this->assertEquals(sizeof($result['foobar@foobar.com']->phones), 3);
  41. $foo = $result['foo@foo.com']->phones->toArray();
  42. $bar = $result['bar@bar.com']->phones->toArray();
  43. $foobar = $result['foobar@foobar.com']->phones->toArray();
  44. $this->assertArrayHasKey(1, $foo);
  45. $this->assertArrayHasKey(2, $foo);
  46. $this->assertArrayHasKey(3, $foo);
  47. $this->assertArrayHasKey(4, $bar);
  48. $this->assertArrayHasKey(5, $bar);
  49. $this->assertArrayHasKey(6, $bar);
  50. $this->assertArrayHasKey(7, $foobar);
  51. $this->assertArrayHasKey(8, $foobar);
  52. $this->assertArrayHasKey(9, $foobar);
  53. }
  54. public function testTicket()
  55. {
  56. $builder = $this->_em->createQueryBuilder();
  57. $builder->select('u')->from(__NAMESPACE__ . '\DDC1335User', 'u', 'u.id');
  58. $dql = $builder->getQuery()->getDQL();
  59. $result = $builder->getQuery()->getResult();
  60. $this->assertEquals(sizeof($result), 3);
  61. $this->assertArrayHasKey(1, $result);
  62. $this->assertArrayHasKey(2, $result);
  63. $this->assertArrayHasKey(3, $result);
  64. $this->assertEquals('SELECT u FROM ' . __NAMESPACE__ . '\DDC1335User u INDEX BY u.id', $dql);
  65. }
  66. public function testIndexByUnique()
  67. {
  68. $builder = $this->_em->createQueryBuilder();
  69. $builder->select('u')->from(__NAMESPACE__ . '\DDC1335User', 'u', 'u.email');
  70. $dql = $builder->getQuery()->getDQL();
  71. $result = $builder->getQuery()->getResult();
  72. $this->assertEquals(sizeof($result), 3);
  73. $this->assertArrayHasKey('foo@foo.com', $result);
  74. $this->assertArrayHasKey('bar@bar.com', $result);
  75. $this->assertArrayHasKey('foobar@foobar.com', $result);
  76. $this->assertEquals('SELECT u FROM ' . __NAMESPACE__ . '\DDC1335User u INDEX BY u.email', $dql);
  77. }
  78. public function testIndexWithJoin()
  79. {
  80. $builder = $this->_em->createQueryBuilder();
  81. $builder->select('u','p')
  82. ->from(__NAMESPACE__ . '\DDC1335User', 'u', 'u.email')
  83. ->join('u.phones', 'p', null, null, 'p.id');
  84. $dql = $builder->getQuery()->getDQL();
  85. $result = $builder->getQuery()->getResult();
  86. $this->assertEquals(sizeof($result), 3);
  87. $this->assertArrayHasKey('foo@foo.com', $result);
  88. $this->assertArrayHasKey('bar@bar.com', $result);
  89. $this->assertArrayHasKey('foobar@foobar.com', $result);
  90. $this->assertEquals(sizeof($result['foo@foo.com']->phones), 3);
  91. $this->assertEquals(sizeof($result['bar@bar.com']->phones), 3);
  92. $this->assertEquals(sizeof($result['foobar@foobar.com']->phones), 3);
  93. $this->assertArrayHasKey(1, $result['foo@foo.com']->phones->toArray());
  94. $this->assertArrayHasKey(2, $result['foo@foo.com']->phones->toArray());
  95. $this->assertArrayHasKey(3, $result['foo@foo.com']->phones->toArray());
  96. $this->assertArrayHasKey(4, $result['bar@bar.com']->phones->toArray());
  97. $this->assertArrayHasKey(5, $result['bar@bar.com']->phones->toArray());
  98. $this->assertArrayHasKey(6, $result['bar@bar.com']->phones->toArray());
  99. $this->assertArrayHasKey(7, $result['foobar@foobar.com']->phones->toArray());
  100. $this->assertArrayHasKey(8, $result['foobar@foobar.com']->phones->toArray());
  101. $this->assertArrayHasKey(9, $result['foobar@foobar.com']->phones->toArray());
  102. $this->assertEquals('SELECT u, p FROM '.__NAMESPACE__ . '\DDC1335User u INDEX BY u.email INNER JOIN u.phones p INDEX BY p.id', $dql);
  103. }
  104. private function loadFixture()
  105. {
  106. $p1 = array('11 xxxx-xxxx','11 yyyy-yyyy','11 zzzz-zzzz');
  107. $p2 = array('22 xxxx-xxxx','22 yyyy-yyyy','22 zzzz-zzzz');
  108. $p3 = array('33 xxxx-xxxx','33 yyyy-yyyy','33 zzzz-zzzz');
  109. $u1 = new DDC1335User("foo@foo.com", "Foo",$p1);
  110. $u2 = new DDC1335User("bar@bar.com", "Bar",$p2);
  111. $u3 = new DDC1335User("foobar@foobar.com", "Foo Bar",$p3);
  112. $this->_em->persist($u1);
  113. $this->_em->persist($u2);
  114. $this->_em->persist($u3);
  115. $this->_em->flush();
  116. $this->_em->clear();
  117. }
  118. }
  119. /**
  120. * @Entity
  121. */
  122. class DDC1335User
  123. {
  124. /**
  125. * @Id @Column(type="integer")
  126. * @GeneratedValue
  127. */
  128. public $id;
  129. /**
  130. * @Column(type="string", unique=true)
  131. */
  132. public $email;
  133. /**
  134. * @Column(type="string")
  135. */
  136. public $name;
  137. /**
  138. * @OneToMany(targetEntity="DDC1335Phone", mappedBy="user", cascade={"persist", "remove"})
  139. */
  140. public $phones;
  141. public function __construct($email, $name, array $numbers = array())
  142. {
  143. $this->name = $name;
  144. $this->email = $email;
  145. $this->phones = new \Doctrine\Common\Collections\ArrayCollection();
  146. foreach ($numbers as $number) {
  147. $this->phones->add(new DDC1335Phone($this,$number));
  148. }
  149. }
  150. }
  151. /**
  152. * @Entity
  153. */
  154. class DDC1335Phone
  155. {
  156. /**
  157. * @Id
  158. * @Column(name="id", type="integer")
  159. * @GeneratedValue
  160. */
  161. public $id;
  162. /**
  163. * @Column(name="numericalValue", type="string", nullable = false)
  164. */
  165. public $numericalValue;
  166. /**
  167. * @ManyToOne(targetEntity="DDC1335User", inversedBy="phones")
  168. * @JoinColumn(name="user_id", referencedColumnName="id", nullable = false)
  169. */
  170. public $user;
  171. public function __construct($user, $number)
  172. {
  173. $this->user = $user;
  174. $this->numericalValue = $number;
  175. }
  176. }