Symfony在同一天的日期之间搜索

时间:2017-01-16 10:00:18

标签: php symfony date

我有一个查询构建器,在我的数据库中搜索两个日期之间。 我无法指定搜索必须是00:00:00到23:59:59。 你知道吗或者我必须把它放好吗?我的所有尝试都导致错误。

这是我的控制器:

 public function searchAction(Request $request){

// TODO MAXLIMIT

    $defaultData = [];
    $form = $this->createFormBuilder($defaultData)
        ->add('from', DateType::class, [
            'widget' => 'single_text',
            'format' => 'dd-MM-yyyy',
            'attr' => [
                'class' => 'datepicker'
            ]
        ])
        ->add('to', DateType::class, [
            'widget' => 'single_text',
            'format' => 'dd-MM-yyyy',
            'attr' => [
                'class' => 'datepicker2'
            ]])
        ->add('submit', SubmitType::class)
        ->getForm();
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager()->getRepository('BudgetBundle:Debit');



        $from = $form['from']->getData();
        var_dump($from);
        $to = $form['to']->getData();
        $debits = $em->getByDate($from, $to);
        return $this->render('@Budget/Views/search.html.twig', ['form' => $form->createView(), 'debits' => $debits]);


    }

我的回购:

    public function getByDate($from, $to){



    $qb = $this->createQueryBuilder("d");
    $qb
        ->where('d.date BETWEEN :from AND :to')
        ->setParameter('from', $from->format('d-MM-yy' . '00:00:00') )
        ->setParameter('to', $to);
  return  $result = $qb->getQuery()->getResult();

}

js观点:

<script>
$( function() {
    $( "#form_from" ).datepicker({
        firstDay: 1,
        altField: "#datepicker",
        closeText: 'Fermer',
        prevText: 'Précédent',
        nextText: 'Suivant',
        currentText: 'Aujourd\'hui',
        monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
        monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],
        dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
        dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'],
        dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
        weekHeader: 'Sem.',
        dateFormat: 'dd-mm-yy'});
    $( "#form_to" ).datepicker({
        firstDay: 1,
        altField: "#datepicker",
        closeText: 'Fermer',
        prevText: 'Précédent',
        nextText: 'Suivant',
        currentText: 'Aujourd\'hui',
        monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
        monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],
        dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
        dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'],
        dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
        weekHeader: 'Sem.',
        dateFormat: 'dd-mm-yy'});  } );

3 个答案:

答案 0 :(得分:0)

您的查询参数函数似乎不匹配 尝试;

public function getByDate($from, $to){
    $qb = $this->createQueryBuilder("d");
    $qb
        ->where('d.date BETWEEN :from AND :to')
        ->setParameter(':from', $from->format('d-MM-yy' . '00:00:00') )
        ->setParameter(':to', $to);
  return  $result = $qb->getQuery()->getResult();

}

另外,只需检查您的日期格式是否为coorect。大多数数据库以YYYY-mm-dd格式存储日期,因此正确的格式为->setParameter(':from', $from->format('Y-m-d 00:00:00') 此外,如果你想要一整天,为什么不调整你的日期到第二天,并做大于或等于从,少于和。 E.g。

public function getByDate(\DateTime $from, \DateTime $to) {
    $end = clone $from;
    $end->modify('+1 day');
    $qb = $this->createQueryBuilder("d");
    $qb
        ->where('d.date >= :from AND d.date < :end')
        ->setParameter(':from', $from->format('Y-m-d 00:00:00') )
        ->setParameter(':end', $end->format('Y-m-d 00:00:00');
    return  $result = $qb->getQuery()->getResult();
}

答案 1 :(得分:0)

首先,对于DateTime操作,我建议使用Carbon http://carbon.nesbot.com/

回答你的问题:

如果查询不依赖于时间,那么比较2个日期就可以了。如果你比较也取决于时间,那么你需要DateTime

答案 2 :(得分:0)

在您的回购中,首先格式化日期,然后追加适当的小时数。确保日期和时间之间有空格:

$qb
    ->where('d.date BETWEEN :from AND :to')
    ->setParameter('from', $from->format('Y-m-d') . ' 00:00:00')
    ->setParameter('to', $to->format('Y-m-d') . ' 23:59:59');