是否可以在doctrine 2查询构建器中使用index by,如果是,那么正确的语法是什么?
答案 0 :(得分:42)
从2.2开始,您现在可以在from语句中包含INDEX BY。如果要添加from子句,
$qb->from($class, $alias, $indexBy);
如果您已经有要替换的from子句,则可以将其替换为:
$qb->add('from', new Expr\From($class, $alias, $indexBy), false);
还有一个open pull请求将它添加到Repository的createQueryBuilder函数中,所以希望很快就会添加它。
答案 1 :(得分:6)
进行更新。你可以这样做。
$qb = $entityManager->createQueryBuilder();
$qb->from($repository->getClassName(), 'a', 'a.id');
$qb->select(a);
$result = new ArrayCollection($qb->getQuery()->getResult());
因此,数组集合将包含正确的索引元素。
答案 2 :(得分:4)
这是使用querybuilder时的一种解决方案,使用手动注入索引子句 -
(do you querybuilder statement)
$q = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL()));
这似乎对我有用......
答案 3 :(得分:2)
正确的语法和最简单的方法是:
$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult();
这将按实体名称字段索引结果。
答案 4 :(得分:0)
您还可以使用外键的默认INDEX BY,例如“yourIndexValue_id”直接在您的映射中:
/**
* @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id")
*/
protected $bars;
不幸的是,似乎没有记录您必须使用外键本身列的名称。
答案 5 :(得分:-1)
是的,可以使用查询构建器。一个小例子,我们假设我们想要通过t.someField进行索引。观察方法中的第三个参数。
<?php
$query = $em->createQueryBuilder()
->select('t.somefield', 't.someOtherField')
->setFrom('Entity\Table', 't', 't.someField')
->getQuery()
$results = $query->getArrayResult();
//your result will look something like:
$results['somefieldvalue'] = array(array('somefield' => 'value', 'someOtherField' => 'test'));
?>
至少应该在Doctrine 2.1中使用。在Doctrine 2.0中,它尚未得到支持。在Doctrine 2.0中,只有在使用DQL指定它时才支持它。