gpt4 book ai didi

symfony - Doctrine Query Builder, "between"表达式和子查询

转载 作者:行者123 更新时间:2023-12-02 01:15:01 25 4
gpt4 key购买 nike

我正在尝试使用 Doctrine 的查询构建器创建一个相当复杂的查询(我使用的是 Doctrine 2.2)。在模型中,我有一个 Distributor 类和一个具有一对多关系的 DistributorVisit 类。每次代表拜访经销商时,DistributorVisit 表都会添加一个新行,其中包含拜访日期。可以找到两个表的ER图here .

现在我希望能够按他们的上次访问日期 筛选经销商。因此,用户输入一个日期范围(上次访问自和上次访问至),然后列出上次访问日期在这两个日期之间的分销商。我正在使用 Doctrine 的查询生成器,因为我在过滤器中执行了很多其他条件查询,而且我发现面向对象的方法在这种情况下效果最好。这是我在 DistributorRepository 类中所做的:

$qb = $this->getEntityManager()->createQueryBuilder()
->select('o')
->from('MyBundle:Distributor', 'o');

// Lots of 'andWhere's here

$qbv = $this->getEntityManager()->createQueryBuilder();

$qb->andWhere($qb->expr()->between(

$qbv->select($qbv->expr()->max('v.visitDate'))
->from('MyBundle:DistributorVisit', 'v')
->join('MyBundle:Distributor', 'o2',
Join::WITH,
$qbv->expr()->andX(
$qbv->expr()->eq('o2.id', 'v.distributorId'),
$qbv->expr()->eq('o2.id', 'o.id')
))
->getDQL(),

$filter->getLastVisitFrom()->getTimestamp(),
$filter->getLastVisitTo()->getTimestamp()
));

这给了我以下错误:

[Syntax Error] line 0, col 83: Error: Expected Literal, got 'SELECT'

我想这是因为查询构建器期望我的子选择所在的文字,但是,子查询的结果应该是文字,对吗?可能是因为Query Builder没有相应地添加括号?

非常感谢您的帮助。

最佳答案

我现在通过以下方式解决了这个问题:

$qb = $this->getEntityManager()->createQueryBuilder()
->select('o')
->from('MyBundle:Distributor', 'o');

$qbdv = $this->getEntityManager()->createQueryBuilder();
$qbdv->select('MAX(dv2.visitDate)')
->from('MyBundle:DistributorVisit', 'dv2')
->where($qbdv->expr()->eq('dv2.distributor', 'o'));

$maxVisitDate = '('.$qbdv->getDQL().')';

$qb->leftJoin(
'o.distributorVisits',
'dv',
Join::WITH,
$qb->expr()->eq('dv.visitDate', $maxVisitDate)
);

$qb->andWhere(
$qb->expr()->between(
'dv.visitDate',
':dateFrom',
':dateTo'
)
)
->setParameter('dateFrom', $filter->getLastVisitFrom())
->setParameter('dateTo', $filter->getLastVisitTo());

所以我基本上做了以下事情:我将 DistributorVisit 表加入到具有最大访问日期的 Distributor 表中。诀窍在于可以将(子)查询的 DQL ($qb1->getDQL()) 直接传递给 Doctrine 表达式 ($qb2->expr() ->eq('column', $qb1->getDQL())。我在上面的代码中使用左连接完成了此操作。

关于symfony - Doctrine Query Builder, "between"表达式和子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12601413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com