Php Doctrine2中的索引暗示
有没有办法提示在Doctrine2中使用索引?MySQL的等效使用索引语法:Php Doctrine2中的索引暗示,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,有没有办法提示在Doctrine2中使用索引?MySQL的等效使用索引语法: SELECT * FROM user u USE INDEX(my_super_index) ... 我发现了一个使用自定义树漫游器的工作代码要点: 感谢作者 但是,对于使用与MySQL不同语法的RDBMS,它将不起作用 更新:前面的代码不适用于FROM子句中包含多个表的查询。这是我之前walker的更新版本: <?php namespace __YOUR_NAMESPACE_; use Doctrine\
SELECT * FROM user u USE INDEX(my_super_index) ...
我发现了一个使用自定义树漫游器的工作代码要点: 感谢作者 但是,对于使用与MySQL不同语法的RDBMS,它将不起作用 更新:前面的代码不适用于FROM子句中包含多个表的查询。这是我之前walker的更新版本:
<?php
namespace __YOUR_NAMESPACE_;
use Doctrine\ORM\Query\SqlWalker;
class UseIndexWalker extends SqlWalker
{
const HINT_USE_INDEX = 'UseIndexWalker.UseIndex';
public function walkFromClause($fromClause)
{
$sql = parent::walkFromClause($fromClause);
$index = $this->getQuery()->getHint(self::HINT_USE_INDEX);
return preg_replace('/( INNER JOIN| LEFT JOIN|$)/', sprintf(' USE INDEX(%s)\1', $index), $sql, 1);
}
}
请注意,当您在Symfony中的存储库中的查询上实现此功能时,必须为提示查询的值设置FDQN::Hint\u CUSTOM\u OUTPUT\u WALKER
<?php
namespace __YOUR_NAMESPACE_\Repository;
use Doctrine\ORM\Query;
use __YOUR_NAMESPACE_\UseIndexWalker;
class MyEntityRepository extends EntityRepository
{
public function myFunction()
{
$query = $this->entityManager->createQueryBuilder()->select('my_field')->from('my_entity', 'my_entity')->getQuery();
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, UseIndexWalker::class);
$query->setHint(UseIndexWalker::HINT_USE_INDEX, 'my_super_index');
}
}