Skip to content

Instantly share code, notes, and snippets.

@doctrinebot
Created December 13, 2015 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doctrinebot/484248d59d9ed304e134 to your computer and use it in GitHub Desktop.
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
<?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