QueryBuilder合并日期和时间

粉碎

我想找到两个日期时间之间的冲突。问题是在数据库中我分别有日期和时间字段所以我做了concat(date,time):

public function findConflictingEvents($datef,$dateu,$personID){
    $from = $datef->format('Y-m-d H:i:s');
    $until = $dateu->format('Y-m-d H:i:s');

    $qb = $this->createQueryBuilder('event');
    $qb->select('event')
        ->innerJoin('event.visitors', 'p')
        ->add('where',
            $qb->expr()->orX(
                $qb->expr()->andX(
                    $qb->expr()->lte(':until', $qb->expr()->concat('event.date_until', 
                        $qb->expr()->literal(' '), 'event.time_until')),
                    $qb->expr()->gte(':until', $qb->expr()->concat('event.date_from', 
                        $qb->expr()->literal(' '), 'event.time_from'))
                ),
                $qb->expr()->andX(
                    $qb->expr()->lte(':from', $qb->expr()->concat('event.date_until',
                        $qb->expr()->literal(' '), 'event.time_until')),
                    $qb->expr()->gte(':from', $qb->expr()->concat('event.date_from', 
                        $qb->expr()->literal(' '), 'event.time_from'))
                ),
                $qb->expr()->andX(
                    $qb->expr()->lte(':from', $qb->expr()->concat('event.date_from', 
                        $qb->expr()->literal(' '), 'event.time_from')),
                    $qb->expr()->gte(':until', $qb->expr()->concat('event.date_until', 
                        $qb->expr()->literal(' '), 'event.time_until'))
                )
            )                
        )
        ->andWhere('p.id = ?1')
        ->setParameter('from', $from)
        ->setParameter('until', $until)
        ->setParameter(1, $personID);
     return $qb->getQuery()->getResult();
}

但是查询给出了意外的结果。我认为我应该转换为时间戳,然后进行比较。

  • 如何在doctrine2 querybuilder中将日期和时间转换为unix_timestamp?
  • 还是有其他想法怎么做?

先感谢您!

亚当·埃尔索达尼(Adam Elsodaney)

绑定参数和检查日期时间范围的表达式分配方式错误。此外,串联需要两个参数,您需要在第三部分再次使用它。

此外,使用Doctrine时,最好将数据库视为对象而不是表。尽可能使用对象。返回一个新ArrayCollection数组,而不是一个数组,并允许您的存储库方法接受的实例Person并从那里获取ID。

use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;

use Your\Bundle\Entity\Event;
use Your\Bundle\Entity\Person;

class EventRepository extends EntityRepository
{
    /**
     * @param \DateTime $from
     * @param \DateTime $until
     * @param Person    $person
     *
     * @return Event[]|Collection
     */
    public function findConflictingEvents(\DateTime $from, \DateTime $until, Person $person)
    {
        $qb = $this->createQueryBuilder('event');
        $qb->select('event')
            ->innerJoin('event.visitors', 'p')
            ->add('where',
                $qb->expr()->orX(
                    $qb->expr()->andX(
                        $qb->expr()->lte(
                            $this->buildDateTimeUntilExpression($qb),
                            ':until'
                        ),
                        $qb->expr()->gte(
                            $this->buildDateTimeFromExpression($qb),
                            ':until'
                        )
                    ),
                    $qb->expr()->andX(
                        $qb->expr()->lte(
                            $this->buildDateTimeUntilExpression($qb),
                            ':from'
                        ),
                        $qb->expr()->gte(
                            $this->buildDateTimeFromExpression($qb),
                            ':from'
                        )
                    ),
                    $qb->expr()->andX(
                        $qb->expr()->lte(
                            $this->buildDateTimeFromExpression($qb),
                            ':from'
                        ),
                        $qb->expr()->gte(
                            $this->buildDateTimeUntilExpression($qb),
                            ':until'
                        )
                    )
                )
            )
            ->andWhere('p.id = ?1')
            ->setParameter('from', $from)
            ->setParameter('until', $until)
            ->setParameter(1, $person->getId());
        ;

        return new ArrayCollection($qb->getQuery()->getResult());
    }

    /**
     * @param QueryBuilder $qb
     *
     * @return mixed
     */
    private function buildDateTimeUntilExpression(QueryBuilder $qb)
    {
        return $qb->expr()->concat('event.dateUntil', $qb->expr()->concat($qb->expr()->literal(' '), 'event.timeUntil'));
    }

    /**
     * @param QueryBuilder $qb
     *
     * @return mixed
     */
    private function buildDateTimeFromExpression(QueryBuilder $qb)
    {
        return $qb->expr()->concat('event.dateFrom', $qb->expr()->concat($qb->expr()->literal(' '), 'event.timeFrom'));
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章