回答

收藏

忽略了Doctrine生成的SQL鉴别部分

技术问答 技术问答 277 人阅读 | 0 人回复 | 2023-09-14

假设以下AbstractPage模型:- \3 V# h( O/ m/ v& _: d
/* *     @ORM\Entity *     @ORM\Table(name="page") *     @ORM\InheritanceType("SINGLE_TABLE") *     @ORM\DiscriminatorColumn(name="type",type="string") *     @ORM\DiscriminatorMap *    ({ *         "page" = &quotage",*         "link" = "Link" *    }*/以及以下DQL查询:
  U% w* R* x0 A9 k8 K7 f' eSELECT p FROM \Page\Model\AbstractPage生成的SQL将是:* f# j: j* V4 ]
SELECT ... FROM page p0_ WHERE p0_.type IN ('page','link')现在要问的问题:如何WHERE从这个查询中删除这个句子。在更复杂的查询中,这个WHERE子句的这一部分使得某些已定义的索引无法使用。可以添加type索引来解决,但这会让我的索引变大,我觉得没必要。
% r/ D0 @6 o  M0 G7 I6 a& f该AbstractPage它是继承树的根。因此,我们对表中的所有记录都感兴趣。WHERE零件可以做到这一点。2 e" @* t$ R) j' F% Z
所以问题是:WHERE在不必要的情况下,我该怎么做?Doctrine删除此部分。8 G6 o" [' L6 \4 {% ?/ T7 L5 z' m
谢谢!
5 ?2 |# q, C7 X3 j                                                                ; Q  ]+ q+ b( A+ n! N6 @( Q
    解决方案:                                                               
9 J& w' S( S+ A2 s" F% V* m( z                                                                这是我能想到的解决方案。想法是扩展一些理论类来添加所需的功能。保持模型不变。
! I! `, F9 ?0 ~/ B% v* V1 C) E创建扩展SqlWalker新类别(当然是更新名称空间)9 |1 X/ {7 K9 }! I) |# `
$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);  }}$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);  }}然后查询,您可以执行以下操作:
9 J5 R+ W. N" k* Yecho $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_
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则