有没有办法暗示在Doctrine2中使用索引?相当于MySQL USE INDEX语法:
SELECT * FROM user u USE INDEX(my_super_index) ...
答案 0 :(得分:4)
我找到了一个使用自定义树助手的工作代码的要点:https://gist.github.com/arnaud-lb/2704404
感谢作者!
虽然使用与MySQL不同的语法,但它不适用于RDBMS。
更新:以前的代码不适用于FROM子句中包含多个表的查询。所以这是我之前助手的更新版本:
<?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);
}
}
答案 1 :(得分:0)
请注意,当您在Symfony的存储库中的查询上实现此功能时,必须将FDQN设置为提示查询的值:: HINT_CUSTOM_OUTPUT_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');
}
}