158 lines
3.9 KiB
PHP
158 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
|
|
|
require_once __DIR__ . '/../../../TestInit.php';
|
|
|
|
class DDC345Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
|
{
|
|
protected function setUp()
|
|
{
|
|
parent::setUp();
|
|
//$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
|
|
$this->_schemaTool->createSchema(array(
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345User'),
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345Group'),
|
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC345Membership'),
|
|
));
|
|
}
|
|
|
|
public function testTwoIterateHydrations()
|
|
{
|
|
// Create User
|
|
$user = new DDC345User;
|
|
$user->name = 'Test User';
|
|
$this->_em->persist($user); // $em->flush() does not change much here
|
|
|
|
// Create Group
|
|
$group = new DDC345Group;
|
|
$group->name = 'Test Group';
|
|
$this->_em->persist($group); // $em->flush() does not change much here
|
|
|
|
$membership = new DDC345Membership;
|
|
$membership->group = $group;
|
|
$membership->user = $user;
|
|
$membership->state = 'active';
|
|
|
|
//$this->_em->persist($membership); // COMMENT OUT TO SEE BUG
|
|
/*
|
|
This should be not necessary, but without, its PrePersist is called twice,
|
|
$membership seems to be persisted twice, but all properties but the
|
|
ones set by LifecycleCallbacks are deleted.
|
|
*/
|
|
|
|
$user->Memberships->add($membership);
|
|
$group->Memberships->add($membership);
|
|
|
|
$this->_em->flush();
|
|
|
|
$this->assertEquals(1, $membership->prePersistCallCount);
|
|
$this->assertEquals(0, $membership->preUpdateCallCount);
|
|
$this->assertInstanceOf('DateTime', $membership->updated);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Entity
|
|
*/
|
|
class DDC345User
|
|
{
|
|
/**
|
|
* @Id
|
|
* @Column(type="integer")
|
|
* @GeneratedValue
|
|
*/
|
|
public $id;
|
|
|
|
/** @Column(type="string") */
|
|
public $name;
|
|
|
|
/** @OneToMany(targetEntity="DDC345Membership", mappedBy="user", cascade={"persist"}) */
|
|
public $Memberships;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->Memberships = new \Doctrine\Common\Collections\ArrayCollection;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Entity
|
|
*/
|
|
class DDC345Group
|
|
{
|
|
/**
|
|
* @Id
|
|
* @Column(type="integer")
|
|
* @GeneratedValue
|
|
*/
|
|
public $id;
|
|
|
|
/** @Column(type="string") */
|
|
public $name;
|
|
|
|
/** @OneToMany(targetEntity="DDC345Membership", mappedBy="group", cascade={"persist"}) */
|
|
public $Memberships;
|
|
|
|
|
|
public function __construct()
|
|
{
|
|
$this->Memberships = new \Doctrine\Common\Collections\ArrayCollection;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Entity
|
|
* @HasLifecycleCallbacks
|
|
* @Table(name="ddc345_memberships", uniqueConstraints={
|
|
* @UniqueConstraint(name="ddc345_memship_fks", columns={"user_id","group_id"})
|
|
* })
|
|
*/
|
|
class DDC345Membership
|
|
{
|
|
/**
|
|
* @Id
|
|
* @Column(type="integer")
|
|
* @GeneratedValue
|
|
*/
|
|
public $id;
|
|
|
|
/**
|
|
* @OneToOne(targetEntity="DDC345User", inversedBy="Memberships")
|
|
* @JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
|
|
*/
|
|
public $user;
|
|
|
|
/**
|
|
* @OneToOne(targetEntity="DDC345Group", inversedBy="Memberships")
|
|
* @JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
|
|
*/
|
|
public $group;
|
|
|
|
/** @Column(type="string") */
|
|
public $state;
|
|
|
|
/** @Column(type="datetime") */
|
|
public $updated;
|
|
|
|
public $prePersistCallCount = 0;
|
|
public $preUpdateCallCount = 0;
|
|
|
|
/** @PrePersist */
|
|
public function doStuffOnPrePersist()
|
|
{
|
|
//echo "***** PrePersist\n";
|
|
++$this->prePersistCallCount;
|
|
$this->updated = new \DateTime;
|
|
}
|
|
|
|
/** @PreUpdate */
|
|
public function doStuffOnPreUpdate()
|
|
{
|
|
//echo "***** PreUpdate\n";
|
|
++$this->preUpdateCallCount;
|
|
$this->updated = new \DateTime;
|
|
}
|
|
}
|
|
|