这是我在广告资源库中的查询:
$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中进行过任务,所以我必须自定义DQL。
但我希望你能帮助我找到更清洁的解决方案。
答案 0 :(得分:0)
我修正了我的逻辑:
//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'))
config.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'])));
这通常非常令人困惑,因为有几个国家使用不同日期的padões。