Merge pull request #1361 from Ocramius/hotfix/array-property-initialization
Hotfix: Reverting BC Break - PersistentCollection should accept `null` and `array` as constructor parameter
This commit is contained in:
commit
354ccdc58b
@ -189,8 +189,8 @@ class ObjectHydrator extends AbstractHydrator
|
|||||||
$relation = $class->associationMappings[$fieldName];
|
$relation = $class->associationMappings[$fieldName];
|
||||||
$value = $class->reflFields[$fieldName]->getValue($entity);
|
$value = $class->reflFields[$fieldName]->getValue($entity);
|
||||||
|
|
||||||
if ($value === null) {
|
if ($value === null || is_array($value)) {
|
||||||
$value = new ArrayCollection;
|
$value = new ArrayCollection((array) $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! $value instanceof PersistentCollection) {
|
if ( ! $value instanceof PersistentCollection) {
|
||||||
|
@ -103,11 +103,11 @@ final class PersistentCollection extends AbstractLazyCollection implements Selec
|
|||||||
*
|
*
|
||||||
* @param EntityManagerInterface $em The EntityManager the collection will be associated with.
|
* @param EntityManagerInterface $em The EntityManager the collection will be associated with.
|
||||||
* @param ClassMetadata $class The class descriptor of the entity type of this collection.
|
* @param ClassMetadata $class The class descriptor of the entity type of this collection.
|
||||||
* @param Collection $coll The collection elements.
|
* @param Collection $collection The collection elements.
|
||||||
*/
|
*/
|
||||||
public function __construct(EntityManagerInterface $em, $class, $coll)
|
public function __construct(EntityManagerInterface $em, $class, Collection $collection)
|
||||||
{
|
{
|
||||||
$this->collection = $coll;
|
$this->collection = $collection;
|
||||||
$this->em = $em;
|
$this->em = $em;
|
||||||
$this->typeClass = $class;
|
$this->typeClass = $class;
|
||||||
$this->initialized = true;
|
$this->initialized = true;
|
||||||
|
@ -347,7 +347,7 @@ class ResultSetMapping
|
|||||||
* @param string $class The class name of the joined entity.
|
* @param string $class The class name of the joined entity.
|
||||||
* @param string $alias The unique alias to use for the joined entity.
|
* @param string $alias The unique alias to use for the joined entity.
|
||||||
* @param string $parentAlias The alias of the entity result that is the parent of this joined result.
|
* @param string $parentAlias The alias of the entity result that is the parent of this joined result.
|
||||||
* @param object $relation The association field that connects the parent entity result
|
* @param string $relation The association field that connects the parent entity result
|
||||||
* with the joined entity result.
|
* with the joined entity result.
|
||||||
*
|
*
|
||||||
* @return ResultSetMapping This ResultSetMapping instance.
|
* @return ResultSetMapping This ResultSetMapping instance.
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Tests\Models\Hydration;
|
||||||
|
|
||||||
|
/** @Entity */
|
||||||
|
class EntityWithArrayDefaultArrayValueM2M
|
||||||
|
{
|
||||||
|
const CLASSNAME = __CLASS__;
|
||||||
|
|
||||||
|
/** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/** @ManyToMany(targetEntity=SimpleEntity::class) */
|
||||||
|
public $collection = [];
|
||||||
|
}
|
12
tests/Doctrine/Tests/Models/Hydration/SimpleEntity.php
Normal file
12
tests/Doctrine/Tests/Models/Hydration/SimpleEntity.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Tests\Models\Hydration;
|
||||||
|
|
||||||
|
/** @Entity */
|
||||||
|
class SimpleEntity
|
||||||
|
{
|
||||||
|
const CLASSNAME = __CLASS__;
|
||||||
|
|
||||||
|
/** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */
|
||||||
|
public $id;
|
||||||
|
}
|
@ -11,6 +11,7 @@ use Doctrine\ORM\Persisters\Entity\EntityPersister;
|
|||||||
|
|
||||||
use Doctrine\Tests\Models\Cache\Country;
|
use Doctrine\Tests\Models\Cache\Country;
|
||||||
use Doctrine\Common\Collections\Criteria;
|
use Doctrine\Common\Collections\Criteria;
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
use Doctrine\ORM\Query\ResultSetMappingBuilder;
|
use Doctrine\ORM\Query\ResultSetMappingBuilder;
|
||||||
use Doctrine\ORM\PersistentCollection;
|
use Doctrine\ORM\PersistentCollection;
|
||||||
|
|
||||||
@ -390,7 +391,7 @@ abstract class AbstractEntityPersisterTest extends OrmTestCase
|
|||||||
{
|
{
|
||||||
$mapping = $this->em->getClassMetadata('Doctrine\Tests\Models\Cache\Country');
|
$mapping = $this->em->getClassMetadata('Doctrine\Tests\Models\Cache\Country');
|
||||||
$assoc = array('type' => 1);
|
$assoc = array('type' => 1);
|
||||||
$coll = new PersistentCollection($this->em, $mapping, null);
|
$coll = new PersistentCollection($this->em, $mapping, new ArrayCollection());
|
||||||
$persister = $this->createPersisterDefault();
|
$persister = $this->createPersisterDefault();
|
||||||
$entity = new Country("Foo");
|
$entity = new Country("Foo");
|
||||||
|
|
||||||
@ -406,7 +407,7 @@ abstract class AbstractEntityPersisterTest extends OrmTestCase
|
|||||||
{
|
{
|
||||||
$mapping = $this->em->getClassMetadata('Doctrine\Tests\Models\Cache\Country');
|
$mapping = $this->em->getClassMetadata('Doctrine\Tests\Models\Cache\Country');
|
||||||
$assoc = array('type' => 1);
|
$assoc = array('type' => 1);
|
||||||
$coll = new PersistentCollection($this->em, $mapping, null);
|
$coll = new PersistentCollection($this->em, $mapping, new ArrayCollection());
|
||||||
$persister = $this->createPersisterDefault();
|
$persister = $this->createPersisterDefault();
|
||||||
$entity = new Country("Foo");
|
$entity = new Country("Foo");
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ use Doctrine\ORM\Proxy\ProxyFactory;
|
|||||||
use Doctrine\ORM\Mapping\AssociationMapping;
|
use Doctrine\ORM\Mapping\AssociationMapping;
|
||||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||||
use Doctrine\ORM\Query;
|
use Doctrine\ORM\Query;
|
||||||
|
use Doctrine\Tests\Models\Hydration\EntityWithArrayDefaultArrayValueM2M;
|
||||||
|
use Doctrine\Tests\Models\Hydration\SimpleEntity;
|
||||||
|
|
||||||
use Doctrine\Tests\Models\CMS\CmsUser;
|
use Doctrine\Tests\Models\CMS\CmsUser;
|
||||||
|
|
||||||
@ -1956,4 +1958,29 @@ class ObjectHydratorTest extends HydrationTestCase
|
|||||||
$hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
|
$hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
|
||||||
$hydrator->hydrateAll($stmt, $rsm);
|
$hydrator->hydrateAll($stmt, $rsm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFetchJoinCollectionValuedAssociationWithDefaultArrayValue()
|
||||||
|
{
|
||||||
|
$rsm = new ResultSetMapping;
|
||||||
|
|
||||||
|
$rsm->addEntityResult(EntityWithArrayDefaultArrayValueM2M::CLASSNAME, 'e1', null);
|
||||||
|
$rsm->addJoinedEntityResult(SimpleEntity::CLASSNAME, 'e2', 'e1', 'collection');
|
||||||
|
$rsm->addFieldResult('e1', 'a1__id', 'id');
|
||||||
|
$rsm->addFieldResult('e2', 'e2__id', 'id');
|
||||||
|
|
||||||
|
$result = (new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em))
|
||||||
|
->hydrateAll(
|
||||||
|
new HydratorMockStatement([[
|
||||||
|
'a1__id' => '1',
|
||||||
|
'e2__id' => '1',
|
||||||
|
]]),
|
||||||
|
$rsm
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertCount(1, $result);
|
||||||
|
$this->assertInstanceOf(EntityWithArrayDefaultArrayValueM2M::CLASSNAME, $result[0]);
|
||||||
|
$this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0]->collection);
|
||||||
|
$this->assertCount(1, $result[0]->collection);
|
||||||
|
$this->assertInstanceOf(SimpleEntity::CLASSNAME, $result[0]->collection[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
namespace Doctrine\Tests\ORM;
|
namespace Doctrine\Tests\ORM;
|
||||||
|
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\PersistentCollection;
|
use Doctrine\ORM\PersistentCollection;
|
||||||
use Doctrine\Tests\Mocks\ConnectionMock;
|
use Doctrine\Tests\Mocks\ConnectionMock;
|
||||||
|
use Doctrine\Tests\Mocks\DriverMock;
|
||||||
use Doctrine\Tests\Mocks\EntityManagerMock;
|
use Doctrine\Tests\Mocks\EntityManagerMock;
|
||||||
use Doctrine\Tests\Models\ECommerce\ECommerceCart;
|
use Doctrine\Tests\Models\ECommerce\ECommerceCart;
|
||||||
use Doctrine\Tests\OrmTestCase;
|
use Doctrine\Tests\OrmTestCase;
|
||||||
@ -21,15 +23,16 @@ class PersistentCollectionTest extends OrmTestCase
|
|||||||
*/
|
*/
|
||||||
protected $collection;
|
protected $collection;
|
||||||
|
|
||||||
private $_connectionMock;
|
/**
|
||||||
|
* @var \Doctrine\ORM\EntityManagerInterface
|
||||||
|
*/
|
||||||
private $_emMock;
|
private $_emMock;
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
// SUT
|
|
||||||
$this->_connectionMock = new ConnectionMock(array(), new \Doctrine\Tests\Mocks\DriverMock());
|
$this->_emMock = EntityManagerMock::create(new ConnectionMock([], new DriverMock()));
|
||||||
$this->_emMock = EntityManagerMock::create($this->_connectionMock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user