Symonfy2,学说:重复,默认或忽略鉴别器地图?



如何在运行 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);
}
}
}
}

仍未解决重复默认鉴别器值...

相关内容

  • 没有找到相关文章

最新更新