/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1430Test.php

https://github.com/jaikdean/doctrine2 · PHP · 304 lines · 186 code · 55 blank · 63 comment · 0 complexity · 6d79092c3eb3f02406689e4ff3b68c4c MD5 · raw file

  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\Tests\ORM\Functional\Ticket;
  4. use DateTime;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Doctrine\ORM\Annotation as ORM;
  7. use Doctrine\Tests\OrmFunctionalTestCase;
  8. use Exception;
  9. /**
  10. * @group DDC-1430
  11. */
  12. class DDC1430Test extends OrmFunctionalTestCase
  13. {
  14. protected function setUp() : void
  15. {
  16. parent::setUp();
  17. try {
  18. $this->schemaTool->createSchema(
  19. [
  20. $this->em->getClassMetadata(DDC1430Order::class),
  21. $this->em->getClassMetadata(DDC1430OrderProduct::class),
  22. ]
  23. );
  24. $this->loadFixtures();
  25. } catch (Exception $exc) {
  26. }
  27. }
  28. public function testOrderByFields() : void
  29. {
  30. $repository = $this->em->getRepository(DDC1430Order::class);
  31. $builder = $repository->createQueryBuilder('o');
  32. $query = $builder->select('o.id, o.date, COUNT(p.id) AS p_count')
  33. ->leftJoin('o.products', 'p')
  34. ->groupBy('o.id, o.date')
  35. ->orderBy('o.id')
  36. ->getQuery();
  37. self::assertSQLEquals(
  38. 'SELECT o.id, o.date, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o.id, o.date ORDER BY o.id ASC',
  39. $query->getDQL()
  40. );
  41. self::assertSQLEquals(
  42. 'SELECT t0."order_id" AS c0, t0."created_at" AS c1, COUNT(t1."id") AS c2 FROM "DDC1430Order" t0 LEFT JOIN "DDC1430OrderProduct" t1 ON t0."order_id" = t1."order_id" GROUP BY t0."order_id", t0."created_at" ORDER BY t0."order_id" ASC',
  43. $query->getSQL()
  44. );
  45. $result = $query->getResult();
  46. self::assertCount(2, $result);
  47. self::assertArrayHasKey('id', $result[0]);
  48. self::assertArrayHasKey('id', $result[1]);
  49. self::assertArrayHasKey('p_count', $result[0]);
  50. self::assertArrayHasKey('p_count', $result[1]);
  51. self::assertEquals(1, $result[0]['id']);
  52. self::assertEquals(2, $result[1]['id']);
  53. self::assertEquals(2, $result[0]['p_count']);
  54. self::assertEquals(3, $result[1]['p_count']);
  55. }
  56. public function testOrderByAllObjectFields() : void
  57. {
  58. $repository = $this->em->getRepository(DDC1430Order::class);
  59. $builder = $repository->createQueryBuilder('o');
  60. $query = $builder->select('o, COUNT(p.id) AS p_count')
  61. ->leftJoin('o.products', 'p')
  62. ->groupBy('o.id, o.date, o.status')
  63. ->orderBy('o.id')
  64. ->getQuery();
  65. self::assertSQLEquals(
  66. 'SELECT o, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o.id, o.date, o.status ORDER BY o.id ASC',
  67. $query->getDQL()
  68. );
  69. self::assertSQLEquals(
  70. 'SELECT t0."order_id" AS c0, t0."created_at" AS c1, t0."order_status" AS c2, COUNT(t1."id") AS c3 FROM "DDC1430Order" t0 LEFT JOIN "DDC1430OrderProduct" t1 ON t0."order_id" = t1."order_id" GROUP BY t0."order_id", t0."created_at", t0."order_status" ORDER BY t0."order_id" ASC',
  71. $query->getSQL()
  72. );
  73. $result = $query->getResult();
  74. self::assertCount(2, $result);
  75. self::assertInstanceOf(DDC1430Order::class, $result[0][0]);
  76. self::assertInstanceOf(DDC1430Order::class, $result[1][0]);
  77. self::assertEquals($result[0][0]->getId(), 1);
  78. self::assertEquals($result[1][0]->getId(), 2);
  79. self::assertEquals($result[0]['p_count'], 2);
  80. self::assertEquals($result[1]['p_count'], 3);
  81. }
  82. public function testTicket() : void
  83. {
  84. $repository = $this->em->getRepository(DDC1430Order::class);
  85. $builder = $repository->createQueryBuilder('o');
  86. $query = $builder->select('o, COUNT(p.id) AS p_count')
  87. ->leftJoin('o.products', 'p')
  88. ->groupBy('o')
  89. ->orderBy('o.id')
  90. ->getQuery();
  91. self::assertSQLEquals(
  92. 'SELECT o, COUNT(p.id) AS p_count FROM Doctrine\Tests\ORM\Functional\Ticket\DDC1430Order o LEFT JOIN o.products p GROUP BY o ORDER BY o.id ASC',
  93. $query->getDQL()
  94. );
  95. self::assertSQLEquals(
  96. 'SELECT t0."order_id" AS c0, t0."created_at" AS c1, t0."order_status" AS c2, COUNT(t1."id") AS c3 FROM "DDC1430Order" t0 LEFT JOIN "DDC1430OrderProduct" t1 ON t0."order_id" = t1."order_id" GROUP BY t0."order_id", t0."created_at", t0."order_status" ORDER BY t0."order_id" ASC',
  97. $query->getSQL()
  98. );
  99. $result = $query->getResult();
  100. self::assertCount(2, $result);
  101. self::assertInstanceOf(DDC1430Order::class, $result[0][0]);
  102. self::assertInstanceOf(DDC1430Order::class, $result[1][0]);
  103. self::assertEquals($result[0][0]->getId(), 1);
  104. self::assertEquals($result[1][0]->getId(), 2);
  105. self::assertEquals($result[0]['p_count'], 2);
  106. self::assertEquals($result[1]['p_count'], 3);
  107. }
  108. public function loadFixtures()
  109. {
  110. $o1 = new DDC1430Order('NEW');
  111. $o2 = new DDC1430Order('OK');
  112. $o1->addProduct(new DDC1430OrderProduct(1.1));
  113. $o1->addProduct(new DDC1430OrderProduct(1.2));
  114. $o2->addProduct(new DDC1430OrderProduct(2.1));
  115. $o2->addProduct(new DDC1430OrderProduct(2.2));
  116. $o2->addProduct(new DDC1430OrderProduct(2.3));
  117. $this->em->persist($o1);
  118. $this->em->persist($o2);
  119. $this->em->flush();
  120. }
  121. }
  122. /**
  123. * @ORM\Entity
  124. */
  125. class DDC1430Order
  126. {
  127. /**
  128. * @ORM\Id
  129. * @ORM\Column(name="order_id", type="integer")
  130. * @ORM\GeneratedValue()
  131. */
  132. protected $id;
  133. /** @ORM\Column(name="created_at", type="datetime") */
  134. private $date;
  135. /** @ORM\Column(name="order_status", type="string") */
  136. private $status;
  137. /**
  138. * @ORM\OneToMany(targetEntity=DDC1430OrderProduct::class, mappedBy="order", cascade={"persist", "remove"})
  139. *
  140. * @var ArrayCollection $products
  141. */
  142. private $products;
  143. public function __construct($status)
  144. {
  145. $this->status = $status;
  146. $this->date = new DateTime();
  147. $this->products = new ArrayCollection();
  148. }
  149. /**
  150. * @return int
  151. */
  152. public function getId()
  153. {
  154. return $this->id;
  155. }
  156. /**
  157. * @return DateTime
  158. */
  159. public function getDate()
  160. {
  161. return $this->date;
  162. }
  163. /**
  164. * @return string
  165. */
  166. public function getStatus()
  167. {
  168. return $this->status;
  169. }
  170. /**
  171. * @param string $status
  172. */
  173. public function setStatus($status)
  174. {
  175. $this->status = $status;
  176. }
  177. /**
  178. * @return ArrayCollection
  179. */
  180. public function getProducts()
  181. {
  182. return $this->products;
  183. }
  184. public function addProduct(DDC1430OrderProduct $product)
  185. {
  186. $product->setOrder($this);
  187. $this->products->add($product);
  188. }
  189. }
  190. /**
  191. * @ORM\Entity
  192. */
  193. class DDC1430OrderProduct
  194. {
  195. /**
  196. * @ORM\Id
  197. * @ORM\Column(type="integer")
  198. * @ORM\GeneratedValue()
  199. */
  200. protected $id;
  201. /**
  202. * @ORM\ManyToOne(targetEntity=DDC1430Order::class, inversedBy="products")
  203. * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id", nullable = false)
  204. *
  205. * @var DDC1430Order $order
  206. */
  207. private $order;
  208. /** @ORM\Column(type="float") */
  209. private $value;
  210. /**
  211. * @param float $value
  212. */
  213. public function __construct($value)
  214. {
  215. $this->value = $value;
  216. }
  217. /**
  218. * @return int
  219. */
  220. public function getId()
  221. {
  222. return $this->id;
  223. }
  224. /**
  225. * @return DDC1430Order
  226. */
  227. public function getOrder()
  228. {
  229. return $this->order;
  230. }
  231. public function setOrder(DDC1430Order $order)
  232. {
  233. $this->order = $order;
  234. }
  235. /**
  236. * @return float
  237. */
  238. public function getValue()
  239. {
  240. return $this->value;
  241. }
  242. /**
  243. * @param float $value
  244. */
  245. public function setValue($value)
  246. {
  247. $this->value = $value;
  248. }
  249. }