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 回発生します。
誰かがアイデアを得ましたか?
私 の英語はかなり下手なので、別の方法で説明しようと思います: まあ、私はさまざまな日に行われるアートパフォーマンスを手に入れました.
私がやりたいのは、時間内に最も近い出現順に並べることです。しかし、データベースに送信する方法は、開始日、終了日、そしてそれが発生する日(火曜日、水曜日...)です。
私のクエリはこれを行います(最も近いものによる順序付け)が、たとえば水曜日と金曜日に何らかのパフォーマンスが発生したため、クエリはそのパフォーマンスを2回返します(水曜日はオン、金曜日はもう1回)が、それぞれの発生時にのみ取得する必要がありますパフォーマンスは同じですが、順序は同じです (近い順)