Fix DDC-671 - The sourceEntity field has to be corrected to the subclass name when copied from a mapped superclass. Otherwise DQL queries will be wrong, generating wrong table aliases.
This commit is contained in:
parent
72f65c3665
commit
7dc8ef1db9
@ -379,6 +379,10 @@ class ClassMetadataFactory
|
|||||||
private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass)
|
private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass)
|
||||||
{
|
{
|
||||||
foreach ($parentClass->associationMappings as $field => $mapping) {
|
foreach ($parentClass->associationMappings as $field => $mapping) {
|
||||||
|
if ($parentClass->isMappedSuperclass) {
|
||||||
|
$mapping['sourceEntity'] = $subClass->name;
|
||||||
|
}
|
||||||
|
|
||||||
//$subclassMapping = $mapping;
|
//$subclassMapping = $mapping;
|
||||||
if ( ! isset($mapping['inherited']) && ! $parentClass->isMappedSuperclass) {
|
if ( ! isset($mapping['inherited']) && ! $parentClass->isMappedSuperclass) {
|
||||||
$mapping['inherited'] = $parentClass->name;
|
$mapping['inherited'] = $parentClass->name;
|
||||||
|
@ -459,3 +459,48 @@ class User
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class AbstractContentItem
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Doctrine2 entity id
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $id;
|
||||||
|
/**
|
||||||
|
* The parent directory
|
||||||
|
* @var Directory
|
||||||
|
*/
|
||||||
|
protected $parentDirectory;
|
||||||
|
/**
|
||||||
|
* Filename (without extension) or directory name
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Directory extends AbstractContentItem
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $subDirectories;
|
||||||
|
/**
|
||||||
|
* This is a collection of files that are contained in this Directory. Files, for example, could be Pages, but even other files
|
||||||
|
* like media files (css, images etc) are possible.
|
||||||
|
*
|
||||||
|
* @var \Doctrine\Common\Collections\Collection
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $containedFiles;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Page extends AbstractContentItem
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $extension = "html";
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -109,6 +109,34 @@ class AnnotationDriverTest extends AbstractMappingDriverTest
|
|||||||
{
|
{
|
||||||
new $entityClassName;
|
new $entityClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group DDC-671
|
||||||
|
*
|
||||||
|
* Entities for this test are in AbstractMappingDriverTest
|
||||||
|
*/
|
||||||
|
public function testJoinTablesWithMappedSuperclassForAnnotationDriver()
|
||||||
|
{
|
||||||
|
$em = $this->_getTestEntityManager();
|
||||||
|
$em->getConfiguration()->setMetadataDriverImpl($this->_loadDriver());
|
||||||
|
|
||||||
|
$classPage = $em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Page');
|
||||||
|
$this->assertEquals('Doctrine\Tests\ORM\Mapping\Page', $classPage->associationMappings['parentDirectory']['sourceEntity']);
|
||||||
|
$classDirectory = $em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Directory');
|
||||||
|
$this->assertEquals('Doctrine\Tests\ORM\Mapping\Directory', $classDirectory->associationMappings['parentDirectory']['sourceEntity']);
|
||||||
|
|
||||||
|
$dql = "SELECT f FROM Doctrine\Tests\ORM\Mapping\Page f JOIN f.parentDirectory d " .
|
||||||
|
"WHERE (d.url = :url) AND (f.extension = :extension)";
|
||||||
|
|
||||||
|
$query = $em->createQuery($dql)
|
||||||
|
->setParameter('url', "test")
|
||||||
|
->setParameter('extension', "extension");
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
'SELECT c0_.id AS id0, c0_.extension AS extension1, c0_.parent_directory_id AS parent_directory_id2 FROM core_content_pages c0_ INNER JOIN core_content_directories c1_ ON c0_.parent_directory_id = c1_.id WHERE (c1_.url = ?) AND (c0_.extension = ?)',
|
||||||
|
$query->getSql()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,13 +19,20 @@ class YamlMappingDriverTest extends AbstractMappingDriverTest
|
|||||||
return new YamlDriver(__DIR__ . DIRECTORY_SEPARATOR . 'yaml');
|
return new YamlDriver(__DIR__ . DIRECTORY_SEPARATOR . 'yaml');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group DDC-671
|
||||||
|
*
|
||||||
|
* Entities for this test are in AbstractMappingDriverTest
|
||||||
|
*/
|
||||||
public function testJoinTablesWithMappedSuperclassForYamlDriver()
|
public function testJoinTablesWithMappedSuperclassForYamlDriver()
|
||||||
{
|
{
|
||||||
$em = $this->_getTestEntityManager();
|
$em = $this->_getTestEntityManager();
|
||||||
$em->getConfiguration()->setMetadataDriverImpl(new \Doctrine\ORM\Mapping\Driver\YamlDriver(__DIR__ . '/yaml/'));
|
$em->getConfiguration()->setMetadataDriverImpl($this->_loadDriver());
|
||||||
|
|
||||||
var_dump($em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Page'));
|
$classPage = $em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Page');
|
||||||
var_dump($em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Directory'));
|
$this->assertEquals('Doctrine\Tests\ORM\Mapping\Page', $classPage->associationMappings['parentDirectory']['sourceEntity']);
|
||||||
|
$classDirectory = $em->getClassMetadata('Doctrine\Tests\ORM\Mapping\Directory');
|
||||||
|
$this->assertEquals('Doctrine\Tests\ORM\Mapping\Directory', $classDirectory->associationMappings['parentDirectory']['sourceEntity']);
|
||||||
|
|
||||||
$dql = "SELECT f FROM Doctrine\Tests\ORM\Mapping\Page f JOIN f.parentDirectory d " .
|
$dql = "SELECT f FROM Doctrine\Tests\ORM\Mapping\Page f JOIN f.parentDirectory d " .
|
||||||
"WHERE (d.url = :url) AND (f.extension = :extension)";
|
"WHERE (d.url = :url) AND (f.extension = :extension)";
|
||||||
@ -34,55 +41,10 @@ class YamlMappingDriverTest extends AbstractMappingDriverTest
|
|||||||
->setParameter('url', "test")
|
->setParameter('url', "test")
|
||||||
->setParameter('extension', "extension");
|
->setParameter('extension', "extension");
|
||||||
|
|
||||||
var_dump($query->getSql());
|
$this->assertEquals(
|
||||||
|
'SELECT c0_.id AS id0, c0_.extension AS extension1, c0_.parent_directory_id AS parent_directory_id2 FROM core_content_pages c0_ INNER JOIN core_content_directories c1_ ON c0_.parent_directory_id = c1_.id WHERE (c1_.url = ?) AND (c0_.extension = ?)',
|
||||||
// Is there a way to generalize this more? (Instead of a2_., check if the table prefix in the ON clause is set within a FROM or JOIN clause..)
|
$query->getSql()
|
||||||
$this->assertTrue(strpos($query->getSql(), 'a2_.') === false);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Directory extends AbstractContentItem
|
|
||||||
{
|
|
||||||
|
|
||||||
protected $subDirectories;
|
|
||||||
/**
|
|
||||||
* This is a collection of files that are contained in this Directory. Files, for example, could be Pages, but even other files
|
|
||||||
* like media files (css, images etc) are possible.
|
|
||||||
*
|
|
||||||
* @var \Doctrine\Common\Collections\Collection
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
protected $containedFiles;
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Page extends AbstractContentItem
|
|
||||||
{
|
|
||||||
|
|
||||||
protected $extension = "html";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class AbstractContentItem
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Doctrine2 entity id
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
private $id;
|
|
||||||
/**
|
|
||||||
* The parent directory
|
|
||||||
* @var Directory
|
|
||||||
*/
|
|
||||||
protected $parentDirectory;
|
|
||||||
/**
|
|
||||||
* Filename (without extension) or directory name
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $name;
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user