如何在运行 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
/**
* @ORMInheritanceType("SINGLE_TABLE")
* @ORMDiscriminatorColumn(name="service_type_id", type="integer")
* @ORMDiscriminatorMap({
* "1" = "AppBundleEntityServerService",
* "2" = "AppBundleEntityServerService",
* [...]
* "12" = "AppBundleEntityServiceSubService",
* "" = "AppBundleEntityServerService"
* })
*/
生成的联接部分:
LEFT JOIN server_services s2_ ON s0_.server_id = s2_.server_id AND s2_.service_type_id IN ('1', '12')
这是完全不正确的。我有一个 1 - 12 的完整映射。和一个 " 空字符串匹配。如果一行没有已知的映射(在我的代码中(或者如果它是空的,则应将其设置为默认的基本ServerService
。
我确实找到了这篇文章:省略Doctrine生成的SQL的鉴别器部分
但是,它早在 2014 年,就提到了版本差异,并且不补偿重复或默认映射。
编辑:作为记录,我尝试了忽略路由 - 它不起作用。
$q->setHint(DoctrineORMQuery::HINT_CUSTOM_OUTPUT_WALKER, MySqlWalker::class)
->setHint(MySqlWalker::IGNORE_DISCRIMINATION, array('ss'));
仍然返回上述 SQL 联合语句。它确实调用了MySqlWalker;它确实进入setInheritanceType()
调用,但它不会忽略鉴别器映射。:/
找到一个选项的答案:忽略
在原则 2.2.x 中,我的陈述是在 JOIN 中,而不是 WHERE 条款中。使用Doctrine生成的SQL的省略鉴别器部分中的示例,我必须重载->walkJoin()
方法以使忽略正常工作:
/**
* {@inheritdoc}
*/
public function walkJoin($join)
{
$this->checkForHint();
return parent::walkJoin($join);
}
protected function checkForHint()
{
$ignoreDescription = $this->getQuery()->getHint(self::IGNORE_DISCRIMINATION);
if ($ignoreDescription) {
foreach ($this->getQueryComponents() as $k => $component) {
if (in_array($k, $ignoreDescription)) {
/** @var $meta ClassMetadata */
$meta = $component['metadata'];
$meta->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE);
}
}
}
}
仍未解决重复或默认鉴别器值...