gpt4 book ai didi

php - 省略 Doctrine 生成的 SQL 的鉴别器部分

转载 作者:可可西里 更新时间:2023-11-01 12:36:20 25 4
gpt4 key购买 nike

假设以下 AbstractPage 模型:

/*
* @ORM\Entity
* @ORM\Table(name="page")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap
* ({
* "page" = "Page",
* "link" = "Link"
* })
*/

以及以下 DQL 查询:

SELECT p FROM \Page\Model\AbstractPage

生成的 SQL 将是:

SELECT ... FROM page p0_ WHERE p0_.type IN ('page', 'link')

现在的问题是:如何从该查询中删除 WHERE 子句。在更复杂的查询中,WHERE 子句的这一部分使得无法使用某些已定义的索引。这可以通过向索引添加 type 来解决,但这会使我的索引变大,我觉得这没有必要。

AbstractPage 是继承树中的根。因此我们对表中的所有记录感兴趣。省略 WHERE 部分正是这样做的。

所以问题是:我怎样才能让 Doctrine 删除不需要的 WHERE 部分。

谢谢!

最佳答案

这是我能想到的解决方案。这个想法是扩展一些学说类以添加所需的功能。保持模型现在的样子。

创建扩展 SqlWalker 的新类(当然更新命名空间)

<?php

namespace Sad;


use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Query\SqlWalker;

class CustomSqlWalker extends SqlWalker
{

const IGNORE_DISCRIMINATION = 'ignoreDiscrimination';

/**
* {@inheritdoc}
*/
public function walkWhereClause($whereClause)
{
// Get list of aliases in which discrimination should be ignored
$ignoreDescription = $this->getQuery()->getHint(self::IGNORE_DISCRIMINATION);
if ($ignoreDescription !== false) {
// For each aliases...
foreach ($this->getQueryComponents() as $k => $component) {
// ...check if alias is in ignore list
if (in_array($k, $ignoreDescription)) {
/** @var $metaObj ClassMetadata */
$metaObj = $component['metadata'];
// Update inheritance type to disable discrimination where
if ($metaObj->isInheritanceTypeSingleTable()) {
$metaObj->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE);
}
}
}
}
return parent::walkWhereClause($whereClause);
}
}

然后进行查询,您执行以下操作:

echo $entityManager->createQuery("SELECT p FROM \Sad\Schema\AbstractPage as p")->getSQL();
// Output: ELECT p0_.id AS id_0, p0_.name AS name_1, p0_.type AS type_2 FROM page p0_ WHERE p0_.type IN ('page', 'link')

$query = $entityManager->createQuery("SELECT p FROM \Sad\Schema\AbstractPage as p");
// Make sure query uses custom walker
$query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Sad\CustomSqlWalker');
// Specify which aliases should ignore discrimination
$query->setHint(\Sad\CustomSqlWalker::IGNORE_DISCRIMINATION, array('p'));

echo $query->getSQL();
// Output: ELECT p0_.id AS id_0, p0_.name AS name_1, p0_.type AS type_2 FROM page p0_

关于php - 省略 Doctrine 生成的 SQL 的鉴别器部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com