【问题标题】:Doctrine - double join with condition教义 - 有条件的双重连接
【发布时间】:2019-01-09 12:42:48
【问题描述】:

我有这样的结构:

Campaigns
id
visits <- OneToMany relation

Visits
id
actions <- OneToMany relation
orders <- OneToMany relation

Actions
id
visit_id
date

Orders
id
visit_id
date

而且我需要接收带有访问和操作和订单的广告系列,但只有满足条件(它们的日期属性在过去 7 天范围内)。

这是我的代码:

$qb = $this->createQueryBuilder('c');
$qb->join('c.visits', 'v');
$period = isset($params['period']) ? $params['period'] : 7;

$starting_date = new \DateTime("today -{$period} days");
$ending_date = new \DateTime('today 23:59:59');

$qb->innerJoin('v.actions', 'a', 'WITH', 'v.id = a.visit AND a.date >= :starting_date AND a.date <= :ending_date')
            ->setParameter('starting_date', $starting_date)
            ->setParameter('ending_date', $ending_date)
        ;

$qb->innerJoin('v.orders', 'o', 'WITH', 'v.id = o.visit AND o.date >= :starting_date AND o.date <= :ending_date')
            ->setParameter('starting_date', $starting_date)
            ->setParameter('ending_date', $ending_date)
        ;

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

我也尝试了使用 leftJoin 的相同方式,但它返回所有操作和订单,而不仅仅是特定日期范围内的这些。

我也尝试过无条件加入,简单的左加入另一个where,但它也不起作用。

你们知道如何解决这个问题吗?

【问题讨论】:

  • 先做join,然后分别做where条件
  • 嘿,我试过这样 - pastebin.com/4ECwmp3P,但它还是没用。
  • 尽量不要在 andWhere 中使用额外的 AND - 请阅读文档并从简单开始 - 然后根据您的经验积累
  • 在 andWhere 中没有 AND 的结果相同 - pastebin.com/27s6B4MQ,除了“阅读文档”还有其他想法吗?
  • 正如我所说,从一个简单的例子开始(例如,只有一个日期条件),然后通过几个步骤建立你的全部范围

标签: mysql symfony doctrine-orm doctrine dql


【解决方案1】:

问题解决了。在我的数据库中,有日期从 2018 年而不是 2019 年开始的记录。这就是此查询不起作用的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多