Php 推进Symfony2“;或;在两个过滤器之间
我正在尝试从数据库中获取一些数据,这些数据必须在一段时间内开始或结束: 基本SQL查询如下所示:Php 推进Symfony2“;或;在两个过滤器之间,php,sql,symfony,propel,Php,Sql,Symfony,Propel,我正在尝试从数据库中获取一些数据,这些数据必须在一段时间内开始或结束: 基本SQL查询如下所示: SELECT broadcast.id, broadcast.id_channel, broadcast.start_at, broadcast.real_start_at, broadcast.real_end_at, broadcast.title, broadcast.sended, FROM `broadcast` WHERE ( (broadcast.real_start_at
SELECT broadcast.id, broadcast.id_channel, broadcast.start_at, broadcast.real_start_at, broadcast.real_end_at, broadcast.title, broadcast.sended, FROM `broadcast`
WHERE (
(broadcast.real_start_at >= :p1 AND broadcast.real_start_at <= :p2)
OR
(broadcast.real_end_at >= :p3 AND broadcast.real_end_at <= :p4))
AND broadcast.sended=:p5 AND broadcast.id_plurimedia=:p6
LIMIT 50
从“广播”中选择broadcast.id、broadcast.id\u频道、broadcast.start\u at、broadcast.real\u start\u at、broadcast.real\u end\u at、broadcast.title、broadcast.sended
在哪里(
(broadcast.real_start_在>=:p1和broadcast.real_start_在=:p3和broadcast.real_end_在限制(20)处);
->条件('cond1','broadcast.real\u start\u at>=?',$this->date\u start,\Criteria::morerar\u EQUAL)
->条件('cond2','broadcast.real\u start\u at=?',$this->date\u start,\Criteria::morerar\u EQUAL)
->condition('cond5','broadcast.real_end_at我注意到,在包含日期间隔的两个过滤器之间,spreep无法执行简单的“或””(_或()
而且它在标准方面也有问题,所以我用字符串替换标准来解决问题
$broadcastQuery->condition('c1', 'broadcast.real_start_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_start_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c3')
->condition('c1', 'broadcast.real_end_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_end_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c4')
->combine(array('c3', 'c4'), 'or');
$broadcastQuery->condition('c1','broadcast.real\u start\u at>?',$this->date\u start)
->条件('c2','broadcast.real_start_在<?',$this->date_end)
->组合(数组('c1','c2'),'c3')
->条件('c1','broadcast.real\u end\u at>?',$this->date\u start)
->条件('c2','broadcast.real_end_at<?',$this->date_end)
->组合(数组('c1','c2'),'和''c4'))
->组合(数组('c3','c4'),'or');
我注意到,在包含日期间隔的两个过滤器之间,spreep无法执行简单的“或””(_或()
而且它在标准方面也有问题,所以我用字符串替换标准来解决问题
$broadcastQuery->condition('c1', 'broadcast.real_start_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_start_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c3')
->condition('c1', 'broadcast.real_end_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_end_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c4')
->combine(array('c3', 'c4'), 'or');
$broadcastQuery->condition('c1','broadcast.real\u start\u at>?',$this->date\u start)
->条件('c2','broadcast.real_start_在<?',$this->date_end)
->组合(数组('c1','c2'),'c3')
->条件('c1','broadcast.real\u end\u at>?',$this->date\u start)
->条件('c2','broadcast.real_end_at<?',$this->date_end)
->组合(数组('c1','c2'),'和''c4'))
->组合(数组('c3','c4'),'or');
对于使用“最小”和“最大”的任何范围过滤器也是如此:OR将仅适用于两个条件之一。对于使用“最小”和“最大”的任何范围过滤器也是如此:OR将仅适用于两个条件之一。
$broadcastQuery->condition('c1', 'broadcast.real_start_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_start_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c3')
->condition('c1', 'broadcast.real_end_at > ?', $this->date_start)
->condition('c2', 'broadcast.real_end_at < ?', $this->date_end)
->combine(array('c1', 'c2'), 'and', 'c4')
->combine(array('c3', 'c4'), 'or');