这是我在我的广告存储库中使用的查询:
$query->andWhere($query->expr()->lte(':date', 'ad.date'));
if (array_key_exists('date', $paramFetcher)) {
$query->setParameter('date', new \DateTime($paramFetcher['date']));
} else {
$query->setParameter('date', new \DateTime('now'));
}
if (array_key_exists('dateFinal', $paramFetcher)) {
$query
->andWhere($query->expr()->lte('ad.dateFinal', ':dateFinal'))
->setParameter('dateFinal', new \DateTime($paramFetcher['dateFinal']));
} else {// Ad of treatment that has expired
$query
->andWhere($query->expr()->gte('ad.dateFinal', ':dateFinal'))
->setParameter('dateFinal', new \DateTime('now'));
}
我的目的是使参数传递的日期(即开始日期和结束日期)与我的广告期间(即日期和最终日期)相交。
有什么更好的方法吗?
因为我在考虑 apena 使用 to_date 来使 paremetro 的最后日期被理解为日期。当然,由于他在 Doctrine2 中没有 to_date,我将不得不制作一个自定义 DQL。
但是我希望你能帮我找到一个更好的清洁剂解决方案。
最佳答案
我修正了我的逻辑:
//the start date of the search must be less than the end date of Ad
if (array_key_exists('date', $paramFetcher)) {
$date = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['date'])));
$query
->andWhere($query->expr()->gte('ad.dateFinal', 'to_date(:date)'))
->setParameter('date', new \DateTime($date));
}
//the search deadline must always be greater than the date of the Ad
if (array_key_exists('dateFinal', $paramFetcher)) {
$dateFinal = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['dateFinal'])));
$query
->andWhere($query->expr()->lte('ad.date', 'to_date(:dateFinal)'))
->setParameter('dateFinal', new \DateTime($dateFinal));
}
对于广告已经过期的处理,搜索总是做的,其中公告的最终日期必须大于今天的日期
->andWhere($query->expr()->gte('ad.dateFinal', 'to_date(:today)'))
->setParameter('today', new \DateTime('now'))
配置.yml
orm:
...
dql:
...
datetime_functions:
to_date: Delivve\WebBundle\DQL\ToDate
ToDate.php
class ToDate extends FunctionNode
{
public $date;
/**
* @override
*/
public function getSql(SqlWalker $sqlWalker)
{
return "to_date(" . $this->date->dispatch($sqlWalker) . ", 'YYYY-MM-DD')";
}
/**
* @override
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->date = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
通过参数的日期格式为“dd/mm/yyyy”,Datetime 函数的/有问题,所以有这部分代码:
$date = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['date'])));
这通常很令人困惑,因为几个国家/地区使用不同的日期。
关于php - 日期与 Doctrine2 和 Symfony2 的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893957/