1
0
mirror of synced 2024-12-12 22:36:02 +03:00

[2.0][DDC-345] Fixed.

This commit is contained in:
romanb 2010-02-23 14:58:12 +00:00
parent 4685a9ab6a
commit 82e42123de
4 changed files with 170 additions and 4 deletions

View File

@ -219,7 +219,8 @@ final class Query extends AbstractQuery
}
if (is_object($value)) {
$values = $this->_em->getClassMetadata(get_class($value))->getIdentifierValues($value);
//$values = $this->_em->getClassMetadata(get_class($value))->getIdentifierValues($value);
$values = $this->_em->getUnitOfWork()->getEntityIdentifier($value);
//var_dump($this->_em->getUnitOfWork()->getEntityIdentifier($value));
$sqlPositions = $paramMappings[$key];
$sqlParams = array_merge($sqlParams, array_combine((array)$sqlPositions, $values));

View File

@ -607,7 +607,6 @@ class UnitOfWork implements PropertyChangedListener
$idGen = $targetClass->idGenerator;
if ( ! $idGen->isPostInsertGenerator()) {
$idValue = $idGen->generate($this->_em, $entry);
$this->_entityStates[$oid] = self::STATE_MANAGED;
if ( ! $idGen instanceof \Doctrine\ORM\Id\Assigned) {
$this->_entityIdentifiers[$oid] = array($targetClass->identifier[0] => $idValue);
$targetClass->getSingleIdReflectionProperty()->setValue($entry, $idValue);
@ -616,6 +615,7 @@ class UnitOfWork implements PropertyChangedListener
}
$this->addToIdentityMap($entry);
}
$this->_entityStates[$oid] = self::STATE_MANAGED;
// NEW entities are INSERTed within the current unit of work.
$this->_entityInsertions[$oid] = $entry;

View File

@ -615,7 +615,7 @@ class BasicFunctionalTest extends \Doctrine\Tests\OrmFunctionalTestCase
/**
* @group ref
*/
/*public function testQueryEntityByReference()
public function testQueryEntityByReference()
{
$user = new CmsUser;
$user->name = 'Guilherme';
@ -633,13 +633,21 @@ class BasicFunctionalTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->flush();
$this->_em->clear();
//$this->_em->getConnection()->getConfiguration()->setSqlLogger(new \Doctrine\DBAL\Logging\EchoSqlLogger);
$userRef = $this->_em->getReference('Doctrine\Tests\Models\CMS\CmsUser', $user->getId());
$address2 = $this->_em->createQuery('select a from Doctrine\Tests\Models\CMS\CmsAddress a where a.user = :user')
->setParameter('user', $userRef)
->getSingleResult();
$this->assertTrue($address2->getUser() instanceof \Doctrine\ORM\Proxy\Proxy);
$this->assertTrue($userRef === $address2->getUser());
$this->assertFalse($userRef->__isInitialized__);
$this->assertEquals('Germany', $address2->country);
$this->assertEquals('Berlin', $address2->city);
$this->assertEquals('12345', $address2->zip);
}*/
}
//DRAFT OF EXPECTED/DESIRED BEHAVIOR
/*public function testPersistentCollectionContainsDoesNeverInitialize()

View File

@ -0,0 +1,157 @@
<?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->assertTrue($membership->updated instanceof \DateTime);
}
}
/**
* @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")
* @JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
public $user;
/**
* @OneToOne(targetEntity="DDC345Group")
* @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;
}
}