Symfony 2 + Doctrine 2:使用DateTime值根据日期字段查找记录

时间:2012-07-23 19:54:01

标签: symfony doctrine-orm

我有一个名为Event的实体,其字段为startDate(type =" date"),另一个名为slug(type ="字符串&#34)。我已经创建了一个控制器动作来根据这些部分获取特定事件。路由器将eventDate作为格式' Y-m-d'和eventSlug传递。现在我已成功使用$startDate = DateTime::createFromFormat('Y-m-d', $eventDate)创建了一个DateTime对象。现在,如果我发出

$event = $eventRepo->findOneBy(array(
    'startDate' => $startDate,
    'slug'      => $eventSlug,
));

它什么都没有($event为NULL)。我是否遗漏了Doctrine文档中的内容,或者我发现了一个错误?

1 个答案:

答案 0 :(得分:2)

首先确保实际存在具有给定slug和开始日期的Eventslug是否为唯一字段?

无论如何,你可以让Doctrine为你做param转换,而不使用PHP format函数:

$repo = $this->getDoctrine()->getRepository('AcmeHelloBundle:Event');
$qb   = $repo->createQueryBuilder('e');

$event = $qb
    ->andwhere($qb->expr()->eq('e.slug', ':slug'))
    ->andWhere($qb->expr()->eq('e.start_date', ':start_date'))
    ->setParameter('slug', $eventSlug)
    ->setParameter('start_date', $startDate)
    ->getQuery()
        ->getOneOrNullResult();

或者,使用Doctrine param转换器:

/**
 * @Route("/event/show/{slug}/{start_date}")
 * @Method("GET")
 * @ParamConverter("event", class="AcmeHelloBundle:Event")
 * @Template
 */
public function showAction(Event Event)
{
}

在内部,Doctrine param转换器为您完成:它检查请求中的任何参数,并使用slugstart_date查找实体。