Created
December 13, 2015 18:46
-
-
Save doctrinebot/484248d59d9ed304e134 to your computer and use it in GitHub Desktop.
Attachments to Doctrine Jira Issue DDC-501 - https://github.com/doctrine/doctrine2/issues/5008
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Doctrine\Tests\ORM\Functional; | |
use Doctrine\Tests\OrmFunctionalTestCase; | |
use Doctrine\Tests\Models\CMS\CmsUser; | |
use Doctrine\Tests\Models\CMS\CmsGroup; | |
use Doctrine\Tests\Models\CMS\CmsPhonenumber; | |
use Doctrine\Tests\Models\CMS\CmsAddress; | |
use Doctrine\ORM\UnitOfWork; | |
require_once __DIR__ . '/../../TestInit.php'; | |
/** | |
* ----------------- !! NOTE !! -------------------- | |
* To reproduce the manyToMany-Bug it's necessary | |
* to cascade "merge" on cmUser::groups | |
* ------------------------------------------------- | |
* | |
* @PHP-Version 5.3.2 | |
* @PHPUnit-Version 3.4.11 | |
* | |
* @author markus | |
*/ | |
class DetachedPartiallyLoadedEntityTest extends OrmFunctionalTestCase | |
{ | |
protected function setUp() { | |
$this->useModelSet('cms'); | |
parent::setUp(); | |
} | |
public function testCreateUser() | |
{ | |
### Create User | |
$user = $this->createAndPersistUser(); | |
$this->_em->flush(); | |
$this->assertTrue($this->_em->contains($user)); | |
$this->_em->clear(); | |
$this->assertFalse($this->_em->contains($user)); | |
unset($user); | |
### Reload User from DB *without* any associations | |
$userReloaded = $this->loadUserFromEntityManager(); | |
$this->assertTrue($this->_em->contains($userReloaded)); | |
$this->_em->clear(); | |
$this->assertFalse($this->_em->contains($userReloaded)); | |
// freeze and unfreeze | |
$userClone = unserialize(serialize($userReloaded)); | |
$this->assertType('Doctrine\Tests\Models\CMS\CmsUser', $userClone); | |
// detached user can't know about his phonenumbers | |
$this->assertEquals(0, count($userClone->getPhonenumbers())); | |
// detached user can't know about his groups either | |
$this->assertEquals(0, count($userClone->getGroups())); | |
### Merge back and flush | |
$userClone = $this->_em->merge($userClone); | |
/* | |
* Back in managed world I would expect to have my phonenumbers back but they aren't! | |
* Remember I didn't touch (and propably didn't need) them at all while in detached mode. | |
*/ | |
$this->assertEquals(4, count($userClone->getPhonenumbers()), 'Phonenumbers are not available anymore'); | |
/* | |
* This works fine as long as cmUser::groups doesn't cascade "merge" | |
*/ | |
$this->assertEquals(2, count($userClone->getGroups())); | |
$this->_em->flush(); | |
$this->_em->clear(); | |
$this->assertFalse($this->_em->contains($userClone)); | |
### Reload user from DB | |
$userFromEntityManager = $this->loadUserFromEntityManager(); | |
/* | |
* Strange: Now the phonenumbers are back again | |
*/ | |
$this->assertEquals(4, count($userFromEntityManager->getPhonenumbers())); | |
/* | |
* This works fine as long as cmUser::groups doesn't cascade "merge" | |
* Otherwise group memberships are physically deleted now! | |
*/ | |
$this->assertEquals(2, count($userClone->getGroups())); | |
} | |
protected function createAndPersistUser() | |
{ | |
$user = new CmsUser(); | |
$user->name = 'Luka'; | |
$user->username = 'lukacho'; | |
$user->status = 'developer'; | |
foreach(array(1111,2222,3333,4444) as $number) { | |
$phone = new CmsPhonenumber; | |
$phone->phonenumber = $number; | |
$user->addPhonenumber($phone); | |
} | |
foreach(array('Moshers', 'Headbangers') as $groupName) { | |
$group = new CmsGroup; | |
$group->setName($groupName); | |
$user->addGroup($group); | |
} | |
$this->_em->persist($user); | |
return $user; | |
} | |
/** | |
* @return Doctrine\Tests\Models\CMS\CmsUser | |
*/ | |
protected function loadUserFromEntityManager() | |
{ | |
return $this->_em | |
->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name like :name') | |
->setParameter('name', 'Luka') | |
->getSingleResult(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment