Doctrine 2使用QueryBuilder获取表的第一个和最后一个条目

时间:2014-04-11 11:41:51

标签: php sql symfony doctrine-orm query-builder

我有两个表有ManyToOne关系(许多“Entity1”到一个“Entity2”)。

现在我需要从Entity1获取属于Entity2的第一个和最后一个实体。 “Entity2”的“Entity1”的数量将计入“entity1_in_entity2_id”列中。

Entity1中还有一个entity2_id列来识别Entity2。

我知道我可以通过带有Subselects的nativeQuery实现这一点,我已经这样做了,但现在我想用QueryBuilder做这个,但我不知道怎么做。我想尝试MAX()和MIN()来获取最后一个和第一个。

var $ id由函数设置,该函数调用此片段来自的函数。

我自己尝试了一些编码,这是我到目前为止所得到的:

    $qb = $this->createQueryBuilder('e');
    $qb->select()
        ->where('e.entity2_id = ' . $id)
        ->orwhere($qb->expr()->orX(
                $qb->expr()->min('e.entity1_in_entity2_id'),
                $qb->expr()->max('e.entity1_in_entity2_id')
            ));

    return $qb->getQuery()->getResult();

到现在为止我收到以下错误

  

[语法错误]第0行,第114栏:错误:预期=,<,< =,<>,>,> =,!=,得到'或'

并且不要担心名称,我必须遗憾地使用虚拟数据,如果使用真实的表名则会更容易解释:D

1 个答案:

答案 0 :(得分:1)

基于学说文档: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

应该是这样的:

   ->add('where', $qb->expr()->orX(
       $qb->expr()->eq('u.id', $qb->expr()->eq('e.entity1_in_entity2_id', $qb->expr()->min('e.entity1_in_entity2_id')),
       $qb->expr()->eq('u.id', $qb->expr()->eq('e.entity1_in_entity2_id', $qb->expr()->max('e.entity1_in_entity2_id'))
   ))

如果你真的想使用expr,你也可以使用

->addSelect('MAX(e.entity1_in_entity2_id) as maxid,MIN(e.entity1_in_entity2_id) as minid')
->having('e.entity1_in_entity2_id IN(minid,maxid)
or
->having('e.entity1_in_entity2_id = minid OR e.entity1_in_entity2_id = maxid')