Php 如何使用Symfony 3.4从完整日期(类型:日期)检索年份

Php 如何使用Symfony 3.4从完整日期(类型:日期)检索年份,php,symfony,Php,Symfony,我有一个date类型的日期字段。我想取今年的价值。谢谢你给我帮助。 因为我在网上搜索,但没有找到解决办法。 谢谢你的理解 这是我使用的日期格式: $date=$form->get('date')->getData(); $date->格式('Y-m-d') 这是我的存储库: public function findEnglishByTags($date, $categorie, $tags) { $tags_values = $tags->getValues(); ar

我有一个date类型的日期字段。我想取今年的价值。谢谢你给我帮助。 因为我在网上搜索,但没有找到解决办法。 谢谢你的理解

这是我使用的日期格式: $date=$form->get('date')->getData(); $date->格式('Y-m-d') 这是我的存储库:

  public function findEnglishByTags($date, $categorie, $tags) {
    $tags_values = $tags->getValues();
    array_walk($tags_values, function (&$item) {
        $item = $item->getId();
    });

    $qb = $this->createQueryBuilder('english');
    $qb->where('english.date = :date')
            ->andWhere('english.Categorie IN (:categories)')
            ->leftjoin('english.tags', 't')
            ->andWhere('t.id IN (:tags)')
            ->setParameters(array('date' => $date, 'categories' => $categorie->getId(), 'tags' => $tags))
    ;

    return $qb->getQuery()->getResult();
}
我的控制器:

  public function searchAction()
{
    $form = $this->createForm('MDWEB\FrontBundle\Form\InEnglishFrontType');
    $request = $this->container->get('request_stack')->getCurrentRequest();
    $form->handleRequest($request);
    $date = $form->get('date')->getData();
    $categorie = $form->get('categorie')->getData();
    $tags = $form->get('tags')->getData();
    $em = $this->getDoctrine()->getManager();
    $listEnglishs = $em->getRepository('MDWEBInEnglishBundle:InEnglish')
        ->findEnglishBytags(new \DateTime($date->format('Y')), $categorie, $tags);

    return $this->render('MDWEBFrontBundle:InEnglish:list.html.twig', array(
        'form' => $form->createView(),
        'listEnglishs' => $listEnglishs
    ));
}
我想逐年更改日期,因为我的实体中没有名为Year的字段。

new\DateTime($date->format('Y'))不起作用,因为没有这样的
\DateTime
类构造函数。存在的一个,看起来像这样:

public __construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
$startDate = $date->format('Y-01-01');
$endDate = $date->format('Y-12-31');

$qb = $this->createQueryBuilder('english');
$qb->where('english.date BETWEEN :startDate AND :endDate')
        ->andWhere('english.Categorie IN (:categories)')
        ->leftjoin('english.tags', 't')
        ->andWhere('t.id IN (:tags)')
        ->setParameters(array('startDate' => $startDate, 'endDate' => $endDate, 
              'categories' => $categorie->getId(), 'tags' => $tags))
;
我对您的代码有点困惑,请帮助我理解:

  • 您的表单有
    日期
    字段
  • 从表单输入中可以得到
    \DateTime
    对象
  • 您提取提交日期的年份,然后将该年份包装成新的
    \DateTime
    ,并将其传递给存储库
  • 存储库使用该“日期”查询名为“日期”的列

那么,您的“日期”列真的是“日期”类型吗?

问题在于您在存储库中使用的查询。由于数据库中有一个日期字段,并且希望检查该日期是否属于特定年份,因此必须执行以下操作:

public __construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
$startDate = $date->format('Y-01-01');
$endDate = $date->format('Y-12-31');

$qb = $this->createQueryBuilder('english');
$qb->where('english.date BETWEEN :startDate AND :endDate')
        ->andWhere('english.Categorie IN (:categories)')
        ->leftjoin('english.tags', 't')
        ->andWhere('t.id IN (:tags)')
        ->setParameters(array('startDate' => $startDate, 'endDate' => $endDate, 
              'categories' => $categorie->getId(), 'tags' => $tags))
;

事实上,大多数SQL都有一个本机年份函数,但Doctrine并没有实现它。您可以安装以便使用。

您好-当您执行
$date->format('Y')
时会发生什么情况?我应用了它,没有遇到任何问题,但它不会向我发送要显示的结果(我希望按年份搜索出版物,而不是按完整日期(年、月、日))搜索出版物)