DDC345Test.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace Doctrine\Tests\ORM\Functional\Ticket;
  3. require_once __DIR__ . '/../../../TestInit.php';
  4. class DDC345Test extends \Doctrine\Tests\OrmFunctionalTestCase
  5. {
  6. protected function setUp()
  7. {
  8. parent::setUp();
  9. //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
  10. $this->_schemaTool->createSchema(array(
  11. $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345User'),
  12. $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345Group'),
  13. $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345Membership'),
  14. ));
  15. }
  16. public function testTwoIterateHydrations()
  17. {
  18. // Create User
  19. $user = new DDC345User;
  20. $user->name = 'Test User';
  21. $this->_em->persist($user); // $em->flush() does not change much here
  22. // Create Group
  23. $group = new DDC345Group;
  24. $group->name = 'Test Group';
  25. $this->_em->persist($group); // $em->flush() does not change much here
  26. $membership = new DDC345Membership;
  27. $membership->group = $group;
  28. $membership->user = $user;
  29. $membership->state = 'active';
  30. //$this->_em->persist($membership); // COMMENT OUT TO SEE BUG
  31. /*
  32. This should be not necessary, but without, its PrePersist is called twice,
  33. $membership seems to be persisted twice, but all properties but the
  34. ones set by LifecycleCallbacks are deleted.
  35. */
  36. $user->Memberships->add($membership);
  37. $group->Memberships->add($membership);
  38. $this->_em->flush();
  39. $this->assertEquals(1, $membership->prePersistCallCount);
  40. $this->assertEquals(0, $membership->preUpdateCallCount);
  41. $this->assertInstanceOf('DateTime', $membership->updated);
  42. }
  43. }
  44. /**
  45. * @Entity
  46. */
  47. class DDC345User
  48. {
  49. /**
  50. * @Id
  51. * @Column(type="integer")
  52. * @GeneratedValue
  53. */
  54. public $id;
  55. /** @Column(type="string") */
  56. public $name;
  57. /** @OneToMany(targetEntity="DDC345Membership", mappedBy="user", cascade={"persist"}) */
  58. public $Memberships;
  59. public function __construct()
  60. {
  61. $this->Memberships = new \Doctrine\Common\Collections\ArrayCollection;
  62. }
  63. }
  64. /**
  65. * @Entity
  66. */
  67. class DDC345Group
  68. {
  69. /**
  70. * @Id
  71. * @Column(type="integer")
  72. * @GeneratedValue
  73. */
  74. public $id;
  75. /** @Column(type="string") */
  76. public $name;
  77. /** @OneToMany(targetEntity="DDC345Membership", mappedBy="group", cascade={"persist"}) */
  78. public $Memberships;
  79. public function __construct()
  80. {
  81. $this->Memberships = new \Doctrine\Common\Collections\ArrayCollection;
  82. }
  83. }
  84. /**
  85. * @Entity
  86. * @HasLifecycleCallbacks
  87. * @Table(name="ddc345_memberships", uniqueConstraints={
  88. * @UniqueConstraint(name="ddc345_memship_fks", columns={"user_id","group_id"})
  89. * })
  90. */
  91. class DDC345Membership
  92. {
  93. /**
  94. * @Id
  95. * @Column(type="integer")
  96. * @GeneratedValue
  97. */
  98. public $id;
  99. /**
  100. * @OneToOne(targetEntity="DDC345User", inversedBy="Memberships")
  101. * @JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
  102. */
  103. public $user;
  104. /**
  105. * @OneToOne(targetEntity="DDC345Group", inversedBy="Memberships")
  106. * @JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
  107. */
  108. public $group;
  109. /** @Column(type="string") */
  110. public $state;
  111. /** @Column(type="datetime") */
  112. public $updated;
  113. public $prePersistCallCount = 0;
  114. public $preUpdateCallCount = 0;
  115. /** @PrePersist */
  116. public function doStuffOnPrePersist()
  117. {
  118. //echo "***** PrePersist\n";
  119. ++$this->prePersistCallCount;
  120. $this->updated = new \DateTime;
  121. }
  122. /** @PreUpdate */
  123. public function doStuffOnPreUpdate()
  124. {
  125. //echo "***** PreUpdate\n";
  126. ++$this->preUpdateCallCount;
  127. $this->updated = new \DateTime;
  128. }
  129. }