$q = new Doctrine_RawSql();
$q->select('{b.id}, {b.description}, {c.description}')
->from('table1 b FORCE INDEX(best_selling_idx) INNER JOIN table2 c ON b.c_id = c.id')
->addComponent('b', 'Table1 b')
->addComponent('c', 'b.Table2 c');
use Ggergo\SqlIndexHintBundle\SqlIndexWalker;
...
$query = ...;
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SqlIndexWalker::class);
$query->setHint(SqlIndexWalker::HINT_INDEX, [
'your_dql_table_alias' => 'FORCE INDEX FOR JOIN (your_composite_index) FORCE INDEX FOR ORDER BY (PRIMARY)',
'your_another_dql_table_alias' => 'FORCE INDEX (PRIMARY)',
...
]);
3条答案
按热度按时间enxuqcxy1#
我在网上找到的Doctrine_RawSql示例很少,所以下面是我创建查询时所做的工作。
e0uiprwp2#
如果不喜欢原生SQL,可以使用以下补丁。https://gist.github.com/arnaud-lb/2704404
此修补程序建议只创建一个自定义步行者,并按如下所示进行设置
e4eetjau3#
我创建了一个Doctrine SqlWalker扩展来在MySql上使用DQL应用USE INDEX和FORCE INDEX提示。可以与createQuery和createQueryBuilder一起使用。您可以为每个DQL表别名设置不同的索引提示。
https://github.com/ggergo/SqlIndexHintBundle