我有一个查询构建器,在我的数据库中搜索两个日期之间。 我无法指定搜索必须是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'}); } );
答案 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');