使用Doctrine queryBuilder检查重叠的日期范围

时间:2018-07-18 08:31:52

标签: symfony doctrine repository query-builder

我有一个实体“ CalednarEvent”,用于存储我所有用户的事件。 我可以在应用程序中创建事件,每次创建新事件时,都必须检查是否没有其他事件重叠。

CalendarEvent.php

class CalendarEvent
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255, unique=false)
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="reference", type="string", length=255, unique=false)
     */
    private $reference;

    /**
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", name="event_start")
     */
    private $startDate;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", name="event_end")
     */
    private $endDate;

    /**
     * @var bool
     * @ORM\Column(name="isLoan", type="boolean")
     */
    private $isLoan = TRUE;
}

我不得不用loan = true检查同一用户和他的事件。

这是我的存储库功能:

public function findLoanOverlapByUser(User $user, \DateTime $start, \DateTime $end){
        $qb = $this->_em->createQueryBuilder();
        $qb ->select('e')
        ->from($this->_entityName, 'e')

        ->where('e.isLoan = :true')
        ->andWhere('e.user = :id_user')
        ->andWhere('e.startDate > :endDate AND e.endDate > :startDate')


        ->setParameter('true', true)
        ->setParameter('startDate', $start)
        ->setParameter('endDate', $end)
        ->setParameter('id_user', $user->getId())
        ;

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

在我的控制器中,我检查了一下,但工作不正常。我想念什么?

  $otherEvents = $entityManager->getRepository(CalendarEvent::class)->findLoanOverlapByUser($calendarEvent->getUser(), $calendarEvent->getStartDate(), $calendarEvent->getEndDate());

    if($otherEvents != null){
        $request->getSession()->getFlashBag()->add('error', "Il existe un autre évènement dans la période sélectionnée.");
    }else{
        //persist
        $calendarEvent->setTitle($calendarEvent->createTitle());
        $entityManager->persist($calendarEvent);
        $entityManager->flush();
        $request->getSession()->getFlashBag()->add('success', "Prêt de personnel crée");
    }

0 个答案:

没有答案