PHP code example of steevanb / doctrine-entity-merger
1. Go to this page and download the library: Download steevanb/doctrine-entity-merger library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
steevanb / doctrine-entity-merger example snippets
class FooEntity
{
protected $id;
protected $name;
protected $description;
}
$foo1 = $repository
->createQueryBuilder('foo')
->select('PARTIAL foo.{id, name}')
->where('site.id = 1')
->getQuery()
->getSingleResult();
var_dump($foo1->getDescription()); // null, that's fine, description is not in PARTIAL
$foo2 = $repository
->createQueryBuilder('foo')
->select('PARTIAL foo.{id, name, description}')
->where('site.id = 1')
->getQuery()
->getSingleResult();
// $foo1 is same object as $foo2, cause Doctrine know first query hydrated $foo1
// so, when you ask same entity (same id in query) with 2nd query, Doctrine will execute SQL,
// but will not hydrate a new entity
// UnitOfWork will return instance of Foo who is already hydrated, with first query
var_dump(spl_object_hash($foo1) === spl_object_hash($foo2)); // true
// but, as Doctrine return $foo1 in 2nd query, your new field description will not be defined in $foo1
var_dump($foo1->getDescription()); // null, but we want it, cause it's defined in PARTIAL 2nd query
use steevanb\DoctrineEntityMerger\QueryHint;
$foo1 = $repository
->createQueryBuilder('foo')
->select('PARTIAL foo.{id, name}')
->where('site.id = 1')
->getQuery()
->getSingleResult();
var_dump($foo1->getName()); // 'My name' for example
var_dump($foo1->getDescription()); // null, that's fine, description is not in PARTIAL
$foo1->setName('New name');
var_dump($foo1->getName()); // 'New name'
$foo2 = $repository
->createQueryBuilder('foo')
->select('PARTIAL foo.{id, description}')
->where('site.id = 1')
->getQuery()
->setHint(QueryHint::MERGE_ENTITY, true)
->getSingleResult();
var_dump($foo1->getName()); // 'New name', MERGE_ENTITY will not change Foo::$name value if it was already defined in another query before
var_dump($foo1->getDescription()); // 'My description'
$entityManager->getEventManager()->addEventSubscriber(
new steevanb\DoctrineEntityMerger\EventSubscriber\EntityMergerSubscriber()
);