Doctrine orm 条令2查询生成器和索引依据

Doctrine orm 条令2查询生成器和索引依据,doctrine-orm,Doctrine Orm,是否可以在doctrine 2查询生成器中使用index by,如果可以,正确的语法是什么?是的,可以使用查询生成器。一个小例子,假设我们想要通过t.someField进行索引。查看from方法中的第三个参数 <?php $query = $em->createQueryBuilder() ->select('t.somefield', 't.someOtherField') ->setFrom('Entity\Table', 't', 't.someFi

是否可以在doctrine 2查询生成器中使用index by,如果可以,正确的语法是什么?

是的,可以使用查询生成器。一个小例子,假设我们想要通过t.someField进行索引。查看from方法中的第三个参数

<?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'));
?>


这至少应该在原则2.1中起作用。在条令2.0中,它还没有得到支持。在Doctrine 2.0中,仅当您使用DQL指定它时才支持它。

在使用querybuilder时,这里有一个解决方案,使用手动注入索引by子句-

(do you querybuilder statement)
$q  = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL()));

这似乎对我有用…

更新。你可以这样做

$qb = $entityManager->createQueryBuilder();
$qb->from($repository->getClassName(), 'a', 'a.id');
$qb->select(a);

$result = new ArrayCollection($qb->getQuery()->getResult());

因此,数组集合将包含正确索引的元素。

从2.2开始,现在可以在from语句中包含INDEX BY。如果要添加from子句

$qb->from($class, $alias, $indexBy);
如果您已经有了要替换的from子句,则可以将其替换为:

$qb->add('from', new Expr\From($class, $alias, $indexBy), false);

还有一个open pull请求将其添加到存储库的createQueryBuilder函数中,因此希望它能很快被添加。

您也可以在映射中直接使用外键的默认索引,例如“yourIndexValue\u id”:

/**
 * @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id")
 */
protected $bars;
不幸的是,似乎没有记录您必须使用外键本身列的名称


正确的语法和最简单的语法应该是:

$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult();

这将按实体名称字段对结果进行索引。

对于Doctrine 2.1.0-DEV,我使用
$qb->add('from','Entity\Table t index by t.id')嘿,我从2015年开始写,现在还没有:-(我意识到这是一个非常古老的答案,但我想指出的是,这对没有WHERE子句的查询不起作用。