Merge branch 'DDC-671'
This commit is contained in:
commit
6390653df7
@ -379,6 +379,10 @@ class ClassMetadataFactory
|
||||
private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass)
|
||||
{
|
||||
foreach ($parentClass->associationMappings as $field => $mapping) {
|
||||
if ($parentClass->isMappedSuperclass) {
|
||||
$mapping['sourceEntity'] = $subClass->name;
|
||||
}
|
||||
|
||||
//$subclassMapping = $mapping;
|
||||
if ( ! isset($mapping['inherited']) && ! $parentClass->isMappedSuperclass) {
|
||||
$mapping['inherited'] = $parentClass->name;
|
||||
|
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\Tests\Models\DirectoryTree;
|
||||
|
||||
/**
|
||||
* @MappedSuperclass
|
||||
*/
|
||||
abstract class AbstractContentItem
|
||||
{
|
||||
/**
|
||||
* @Id @Column(type="integer") @GeneratedValue
|
||||
*/
|
||||
private $id;
|
||||
|
||||
/**
|
||||
* @ManyToOne(targetEntity="Directory")
|
||||
*/
|
||||
protected $parentDirectory;
|
||||
|
||||
/** @column(type="string") */
|
||||
protected $name;
|
||||
|
||||
public function __construct(Directory $parentDir = null)
|
||||
{
|
||||
$this->parentDirectory = $parentDir;
|
||||
}
|
||||
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function setName($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function getParent()
|
||||
{
|
||||
return $this->parentDirectory;
|
||||
}
|
||||
}
|
41
tests/Doctrine/Tests/Models/DirectoryTree/Directory.php
Normal file
41
tests/Doctrine/Tests/Models/DirectoryTree/Directory.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
namespace Doctrine\Tests\Models\DirectoryTree;
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
*/
|
||||
class Directory extends AbstractContentItem
|
||||
{
|
||||
/**
|
||||
* @Column(type="string")
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
public function setPath($path)
|
||||
{
|
||||
$this->path = $path;
|
||||
}
|
||||
|
||||
public function getPath()
|
||||
{
|
||||
return $this->path;
|
||||
}
|
||||
}
|
45
tests/Doctrine/Tests/Models/DirectoryTree/File.php
Normal file
45
tests/Doctrine/Tests/Models/DirectoryTree/File.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This software consists of voluntary contributions made by many individuals
|
||||
* and is licensed under the LGPL. For more information, see
|
||||
* <http://www.doctrine-project.org>.
|
||||
*/
|
||||
|
||||
|
||||
namespace Doctrine\Tests\Models\DirectoryTree;
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
*/
|
||||
class File extends AbstractContentItem
|
||||
{
|
||||
/** @Column(type="string") */
|
||||
protected $extension = "html";
|
||||
|
||||
public function __construct(Directory $parent = null)
|
||||
{
|
||||
parent::__construct($parent);
|
||||
}
|
||||
|
||||
public function getExtension()
|
||||
{
|
||||
return $this->extension;
|
||||
}
|
||||
|
||||
public function setExtension($ext)
|
||||
{
|
||||
$this->extension = $ext;
|
||||
}
|
||||
}
|
@ -12,100 +12,35 @@ require_once __DIR__ . '/../../TestInit.php';
|
||||
class MappedSuperclassTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
{
|
||||
protected function setUp() {
|
||||
$this->useModelSet('directorytree');
|
||||
parent::setUp();
|
||||
try {
|
||||
$this->_schemaTool->createSchema(array(
|
||||
$this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\EntitySubClass'),
|
||||
));
|
||||
} catch (\Exception $e) {
|
||||
// Swallow all exceptions. We do not test the schema tool here.
|
||||
}
|
||||
}
|
||||
|
||||
public function testCRUD()
|
||||
{
|
||||
$e = new EntitySubClass;
|
||||
$e->setId(1);
|
||||
$e->setName('Roman');
|
||||
$e->setMapped1(42);
|
||||
$e->setMapped2('bar');
|
||||
|
||||
$this->_em->persist($e);
|
||||
$root = new \Doctrine\Tests\Models\DirectoryTree\Directory();
|
||||
$root->setName('Root');
|
||||
$root->setPath('/root');
|
||||
|
||||
$directory = new \Doctrine\Tests\Models\DirectoryTree\Directory($root);
|
||||
$directory->setName('TestA');
|
||||
$directory->setPath('/root/dir');
|
||||
|
||||
$file = new \Doctrine\Tests\Models\DirectoryTree\File($directory);
|
||||
$file->setName('test-b.html');
|
||||
|
||||
$this->_em->persist($root);
|
||||
$this->_em->persist($directory);
|
||||
$this->_em->persist($file);
|
||||
|
||||
$this->_em->flush();
|
||||
$this->_em->clear();
|
||||
|
||||
$e2 = $this->_em->find('Doctrine\Tests\ORM\Functional\EntitySubClass', 1);
|
||||
$this->assertEquals(1, $e2->getId());
|
||||
$this->assertEquals('Roman', $e2->getName());
|
||||
$this->assertNull($e2->getMappedRelated1());
|
||||
$this->assertEquals(42, $e2->getMapped1());
|
||||
$this->assertEquals('bar', $e2->getMapped2());
|
||||
|
||||
$cleanFile = $this->_em->find(get_class($file), $file->getId());
|
||||
|
||||
$this->assertType('Doctrine\Tests\Models\DirectoryTree\Directory', $cleanFile->getParent());
|
||||
$this->assertEquals($directory->getId(), $cleanFile->getParent()->getId());
|
||||
$this->assertType('Doctrine\Tests\Models\DirectoryTree\Directory', $cleanFile->getParent()->getParent());
|
||||
$this->assertEquals($root->getId(), $cleanFile->getParent()->getParent()->getId());
|
||||
}
|
||||
}
|
||||
|
||||
/** @MappedSuperclass */
|
||||
class MappedSuperclassBase {
|
||||
/** @Column(type="integer") */
|
||||
private $mapped1;
|
||||
/** @Column(type="string") */
|
||||
private $mapped2;
|
||||
/**
|
||||
* @OneToOne(targetEntity="MappedSuperclassRelated1")
|
||||
* @JoinColumn(name="related1_id", referencedColumnName="id")
|
||||
*/
|
||||
private $mappedRelated1;
|
||||
private $transient;
|
||||
|
||||
public function setMapped1($val) {
|
||||
$this->mapped1 = $val;
|
||||
}
|
||||
|
||||
public function getMapped1() {
|
||||
return $this->mapped1;
|
||||
}
|
||||
|
||||
public function setMapped2($val) {
|
||||
$this->mapped2 = $val;
|
||||
}
|
||||
|
||||
public function getMapped2() {
|
||||
return $this->mapped2;
|
||||
}
|
||||
|
||||
public function getMappedRelated1() {
|
||||
return $this->mappedRelated1;
|
||||
}
|
||||
}
|
||||
|
||||
/** @Entity */
|
||||
class MappedSuperclassRelated1 {
|
||||
/** @Id @Column(type="integer") */
|
||||
private $id;
|
||||
/** @Column(type="string") */
|
||||
private $name;
|
||||
}
|
||||
|
||||
/** @Entity */
|
||||
class EntitySubClass extends MappedSuperclassBase {
|
||||
/** @Id @Column(type="integer") */
|
||||
private $id;
|
||||
/** @Column(type="string") */
|
||||
private $name;
|
||||
|
||||
public function setName($name) {
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function getName() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -458,4 +458,4 @@ class User
|
||||
'initialValue' => 1,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,6 +109,29 @@ class AnnotationDriverTest extends AbstractMappingDriverTest
|
||||
{
|
||||
new $entityClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-671
|
||||
*
|
||||
* Entities for this test are in AbstractMappingDriverTest
|
||||
*/
|
||||
public function testJoinTablesWithMappedSuperclassForAnnotationDriver()
|
||||
{
|
||||
$annotationDriver = $this->_loadDriver();
|
||||
$annotationDriver->addPaths(array(__DIR__ . '/../../Models/DirectoryTree/'));
|
||||
|
||||
$em = $this->_getTestEntityManager();
|
||||
$em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
|
||||
$factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory($em);
|
||||
|
||||
$classPage = new ClassMetadata('Doctrine\Tests\Models\DirectoryTree\File');
|
||||
$classPage = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\File');
|
||||
$this->assertEquals('Doctrine\Tests\Models\DirectoryTree\File', $classPage->associationMappings['parentDirectory']['sourceEntity']);
|
||||
|
||||
$classDirectory = new ClassMetadata('Doctrine\Tests\Models\DirectoryTree\Directory');
|
||||
$classDirectory = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\Directory');
|
||||
$this->assertEquals('Doctrine\Tests\Models\DirectoryTree\Directory', $classDirectory->associationMappings['parentDirectory']['sourceEntity']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -18,4 +18,28 @@ class YamlMappingDriverTest extends AbstractMappingDriverTest
|
||||
|
||||
return new YamlDriver(__DIR__ . DIRECTORY_SEPARATOR . 'yaml');
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-671
|
||||
*
|
||||
* Entities for this test are in AbstractMappingDriverTest
|
||||
*/
|
||||
public function testJoinTablesWithMappedSuperclassForYamlDriver()
|
||||
{
|
||||
$yamlDriver = $this->_loadDriver();
|
||||
$yamlDriver->addPaths(array(__DIR__ . DIRECTORY_SEPARATOR . 'yaml'));
|
||||
|
||||
$em = $this->_getTestEntityManager();
|
||||
$em->getConfiguration()->setMetadataDriverImpl($yamlDriver);
|
||||
$factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory($em);
|
||||
|
||||
$classPage = new ClassMetadata('Doctrine\Tests\Models\DirectoryTree\File');
|
||||
$classPage = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\File');
|
||||
$this->assertEquals('Doctrine\Tests\Models\DirectoryTree\File', $classPage->associationMappings['parentDirectory']['sourceEntity']);
|
||||
|
||||
$classDirectory = new ClassMetadata('Doctrine\Tests\Models\DirectoryTree\Directory');
|
||||
$classDirectory = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\Directory');
|
||||
$this->assertEquals('Doctrine\Tests\Models\DirectoryTree\Directory', $classDirectory->associationMappings['parentDirectory']['sourceEntity']);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
Doctrine\Tests\Models\DirectoryTree\AbstractContentItem:
|
||||
type: mappedSuperclass
|
||||
id:
|
||||
id:
|
||||
type: integer
|
||||
unsigned: true
|
||||
generator:
|
||||
strategy: AUTO
|
||||
fields:
|
||||
name:
|
||||
type: string
|
||||
manyToOne:
|
||||
parentDirectory:
|
||||
targetEntity: Doctrine\Tests\Models\DirectoryTree\Directory
|
@ -0,0 +1,6 @@
|
||||
Doctrine\Tests\Models\DirectoryTree\Directory:
|
||||
type: entity
|
||||
fields:
|
||||
path:
|
||||
type: string
|
||||
length: 255
|
@ -0,0 +1,6 @@
|
||||
Doctrine\Tests\Models\DirectoryTree\File:
|
||||
type: entity
|
||||
fields:
|
||||
extension:
|
||||
type: string
|
||||
length: 10
|
@ -86,6 +86,11 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
|
||||
'Doctrine\Tests\Models\Navigation\NavTour',
|
||||
'Doctrine\Tests\Models\Navigation\NavPointOfInterest',
|
||||
),
|
||||
'directorytree' => array(
|
||||
'Doctrine\Tests\Models\DirectoryTree\AbstractContentItem',
|
||||
'Doctrine\Tests\Models\DirectoryTree\File',
|
||||
'Doctrine\Tests\Models\DirectoryTree\Directory',
|
||||
),
|
||||
);
|
||||
|
||||
protected function useModelSet($setName)
|
||||
@ -162,6 +167,10 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
|
||||
$conn->executeUpdate('DELETE FROM navigation_tours');
|
||||
$conn->executeUpdate('DELETE FROM navigation_countries');
|
||||
}
|
||||
if (isset($this->_usedModelSets['directorytree'])) {
|
||||
$conn->executeUpdate('DELETE FROM File');
|
||||
$conn->executeUpdate('DELETE FROM Directory');
|
||||
}
|
||||
|
||||
$this->_em->clear();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user