DDC736Test.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace Doctrine\Tests\ORM\Functional\Ticket;
  3. use Doctrine\Tests\Models\ECommerce\ECommerceCart;
  4. use Doctrine\Tests\Models\ECommerce\ECommerceCustomer;
  5. use Doctrine\ORM\Query;
  6. use Doctrine\ORM\Query\AST;
  7. require_once __DIR__ . '/../../../TestInit.php';
  8. class DDC736Test extends \Doctrine\Tests\OrmFunctionalTestCase
  9. {
  10. protected function setUp()
  11. {
  12. $this->useModelSet('ecommerce');
  13. parent::setUp();
  14. }
  15. /**
  16. * @group DDC-736
  17. */
  18. public function testReorderEntityFetchJoinForHydration()
  19. {
  20. $cust = new ECommerceCustomer;
  21. $cust->setName('roman');
  22. $cart = new ECommerceCart;
  23. $cart->setPayment('cash');
  24. $cart->setCustomer($cust);
  25. $this->_em->persist($cust);
  26. $this->_em->persist($cart);
  27. $this->_em->flush();
  28. $this->_em->clear();
  29. $result = $this->_em->createQuery("select c, c.name, ca, ca.payment from Doctrine\Tests\Models\ECommerce\ECommerceCart ca join ca.customer c")
  30. ->getSingleResult(/*\Doctrine\ORM\Query::HYDRATE_ARRAY*/);
  31. $cart2 = $result[0];
  32. unset($result[0]);
  33. $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceCart', $cart2);
  34. $this->assertNotInstanceOf('Doctrine\ORM\Proxy\Proxy', $cart2->getCustomer());
  35. $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceCustomer', $cart2->getCustomer());
  36. $this->assertEquals(array('name' => 'roman', 'payment' => 'cash'), $result);
  37. }
  38. /**
  39. * @group DDC-736
  40. * @group DDC-925
  41. * @group DDC-915
  42. */
  43. public function testDqlTreeWalkerReordering()
  44. {
  45. $cust = new ECommerceCustomer;
  46. $cust->setName('roman');
  47. $cart = new ECommerceCart;
  48. $cart->setPayment('cash');
  49. $cart->setCustomer($cust);
  50. $this->_em->persist($cust);
  51. $this->_em->persist($cart);
  52. $this->_em->flush();
  53. $this->_em->clear();
  54. $dql = "select c, c.name, ca, ca.payment from Doctrine\Tests\Models\ECommerce\ECommerceCart ca join ca.customer c";
  55. $result = $this->_em->createQuery($dql)
  56. ->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\Tests\ORM\Functional\Ticket\DisableFetchJoinTreeWalker'))
  57. ->getResult();
  58. /* @var $cart2 Doctrine\Tests\Models\ECommerce\ECommerceCart */
  59. $cart2 = $result[0][0];
  60. $this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $cart2->getCustomer());
  61. }
  62. }
  63. class DisableFetchJoinTreeWalker extends \Doctrine\ORM\Query\TreeWalkerAdapter
  64. {
  65. public function walkSelectStatement(AST\SelectStatement $AST)
  66. {
  67. $this->walkSelectClause($AST->selectClause);
  68. }
  69. /**
  70. * @param \Doctrine\ORM\Query\AST\SelectClause $selectClause
  71. */
  72. public function walkSelectClause($selectClause)
  73. {
  74. foreach ($selectClause->selectExpressions AS $key => $selectExpr) {
  75. /* @var $selectExpr \Doctrine\ORM\Query\AST\SelectExpression */
  76. if ($selectExpr->expression == "c") {
  77. unset($selectClause->selectExpressions[$key]);
  78. break;
  79. }
  80. }
  81. }
  82. }