Skip to content

Instantly share code, notes, and snippets.

@arnaud-lb
Created May 15, 2012 19:27
Show Gist options
  • Select an option

  • Save arnaud-lb/2704404 to your computer and use it in GitHub Desktop.

Select an option

Save arnaud-lb/2704404 to your computer and use it in GitHub Desktop.
USE INDEX / FORCE INDEX in a Doctrine2 DQL query
<?php
use UseIndexWalker;
use Doctrine\ORM\Query
$query = $em->createQuery("SELECT f FROM Foo f WHERE f.a = 1 and f.b = 2");
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'UseIndexWalker');
$query->setHint(UseIndexWalker::HINT_USE_INDEX, 'some_index_name');
$query->getResult();
<?php
use Doctrine\ORM\Query\SqlWalker;
/**
* Quick hack to allow adding a USE INDEX on the query
*/
class UseIndexWalker extends SqlWalker
{
const HINT_USE_INDEX = 'UseIndexWalker.UseIndex';
public function walkFromClause($fromClause)
{
$result = parent::walkFromClause($fromClause);
if ($index = $this->getQuery()->getHint(self::HINT_USE_INDEX)) {
$result = preg_replace('#(\bFROM\s*\w+\s*\w+)#', '\1 USE INDEX (' . $index . ')', $result);
}
return $result;
}
}
@janedbal
Copy link
Copy Markdown

janedbal commented Feb 22, 2023

Another composer package: shipmonk/doctrine-mysql-index-hints

  • works even for tables nor present in DQL, but present in SQL (Single Table Inheritance)
  • supports Doctrine ORM 3
  • supports subselects

@MarionLeHerisson
Copy link
Copy Markdown

Thanks for the solution ! 🙏
Small fix : in example.php line 8, you can use UseIndexWalker::class instead of 'UseIndexWalker'. It avoids having hardcoded strings in code + it manages if the file is in a different namespace. :)

@vuon9
Copy link
Copy Markdown

vuon9 commented Sep 12, 2025

thanks, you saved me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment