【发布时间】:2018-05-11 18:50:49
【问题描述】:
如何启用重复的鉴别器映射,允许“默认”映射,或在运行 DQL 查询时完全忽略鉴别器映射?
设置:
// DQL Query:
$this->createQueryBuilder('s')
->select(['s.serverId', 'p.projectName'])
->leftJoin('s.serverServices', 'ss')
->leftJoin('ss.serverServiceProjects', 'ps')
->leftJoin('ps.project', 'p')
->getQuery()
->getArrayResult()
// Mapping
/**
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="service_type_id", type="integer")
* @ORM\DiscriminatorMap({
* "1" = "AppBundle\Entity\ServerService",
* "2" = "AppBundle\Entity\ServerService",
* [...]
* "12" = "AppBundle\Entity\Service\SubService",
* "" = "AppBundle\Entity\ServerService"
* })
*/
生成的join部分:
LEFT JOIN server_services s2_ ON s0_.server_id = s2_.server_id AND s2_.service_type_id IN ('1', '12')
这是完全错误的。我有一个 1 - 12 的完整映射。还有一个 "" 空字符串匹配。如果一行没有已知映射(在我的代码中)或者它为空,则应将其设置为默认基 ServerService。
我确实找到了这个帖子:Leave out discriminator part of Doctrine' generated SQL
但是,它是在 2014 年,提到了版本的差异,并且不补偿 duplicate 或 default 映射。
编辑:为了记录,我尝试了忽略路线——它没有用。
$q->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, MySqlWalker::class)
->setHint(MySqlWalker::IGNORE_DISCRIMINATION, array('ss'));
仍然返回上面的 SQL 联合语句。它确实调用了 MySqlWalker;它确实进入了setInheritanceType() 调用,但它确实不忽略了鉴别器映射。 :/
【问题讨论】:
标签: php symfony doctrine-orm dql symfony-2.8