0

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回)が、それぞれの発生時にのみ取得する必要がありますパフォーマンスは同じですが、順序は同じです (近い順)

4

1 に答える 1

0

1 週間に 1 回の使用が必要な場合

$q->groupBy()

週番号に変換された日付。そして、selectで count() を使用してください。あなたの質問を理解しているかどうかわかりません。

于 2012-08-24T12:42:03.253 に答える