1
0
mirror of synced 2024-12-12 14:26:02 +03:00

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:
Bill Schaller 2015-04-04 20:26:19 -04:00
commit 354ccdc58b
8 changed files with 72 additions and 14 deletions

View File

@ -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) {

View File

@ -101,13 +101,13 @@ final class PersistentCollection extends AbstractLazyCollection implements Selec
/** /**
* Creates a new persistent collection. * Creates a new persistent collection.
* *
* @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;

View File

@ -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.

View File

@ -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 = [];
}

View 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;
}

View File

@ -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");

View File

@ -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]);
}
} }

View File

@ -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);
} }
/** /**