我有两个表有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
答案 0 :(得分:1)
应该是这样的:
->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')