我在使用doctrine2时遇到了一些问题。我想订购一个查询,但在星期几之前。
我的意思是:
如果给定日期的日期是Tuesday
,我希望在Tuesday, Wednseday, ..., Sunday, Monday
之前订购。
但一场演出可能会有好几天。
我在这里得到的代码对的订单起到了作用
public function getValidPerformancesByDay2($date, $max = 25, $from, $asSql = false){
$myday = intVal(date('w',strtotime($date)));
$q = $this->getEntityManager()
->createQueryBuilder()
->select('DISTINCT textdesc,
CASE WHEN (perfdays.id < '. $myday .') THEN perfdays.id + 8
ELSE perfdays.id END AS HIDDEN sortvalue')
->from ('sys4winsegundaBundle:Performance','textdesc')
->join('textdesc.days', 'perfdays')
->where ('textdesc.enddate >= :date')
->andWhere('textdesc.isvalid = true')
->orderBy('sortvalue','ASC')
->setMaxResults($max)
->setFirstResult($from)
->setParameter('date',$date)
;
$query = $q->getQuery();
if ($asSql){
return $query;
}
return $query->getResult();
}
但不幸的是,当我看到已经发送的查询时,它是:
SELECT DISTINCT p0_.id AS id0, p0_.name AS name1, p0_.duration AS duration2,
p0_.addedby AS addedby3, p0_.startdate AS startdate4, p0_.enddate AS enddate5,
p0_.starthour AS starthour6, p0_.flyer AS flyer7, p0_.price AS price8,
p0_.discount AS discount9, p0_.isvalid AS isvalid10,
p0_.archivedon AS archivedon11, p0_.description AS description12,
p0_.weblink AS weblink13, p0_.techinfo AS techinfo14, p0_.slug AS slug15,
CASE WHEN (d1_.id < 4) THEN d1_.id + 8 ELSE d1_.id END AS sclr16,
p0_.place_id AS place_id17, p0_.gallery_id AS gallery_id18 FROM performances
p0_ INNER JOIN performance_day p2_ ON p0_.id = p2_.performance_id
INNER JOIN days d1_ ON d1_.id = p2_.day_id WHERE p0_.enddate >= ? AND
p0_.isvalid = 1 ORDER BY sclr16 ASC OFFSET 0
Parameters: ['2012-08-23']
Time: 5.13 ms
这意味着,如果一场演出一周发生3次,我会得到3次。
有人有主意吗?
编辑我的英语很差,我会试着用不同的方式解释:我在不同的日子里都有艺术表演。
我想做的是按照时间上最近的事件来排序。但我把它发送到数据库的方式是有一个开始日期,一个结束日期,然后是它发生的日期(星期二,星期三…)
我的查询会这样做(按最接近的一个排序),但由于某些性能发生在星期三和星期五,我的查询将返回该性能两次(星期三为,另一次为星期五),而我应该只在每次性能发生时检索,但顺序相同(最接近的第一个)
如果您希望每周发生1次,请使用
$q->groupBy()
用于转换为周数的日期。并在选择中使用count()。我不确定我是否理解你的问题。