Doctrine 2查询构建器和索引

时间:2011-12-13 19:21:36

标签: doctrine-orm

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

6 个答案:

答案 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;

不幸的是,似乎没有记录您必须使用外键本身列的名称。

Working with Indexed Associations

答案 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指定它时才支持它。