私は、フラットPHPで構築されたTaskManagerを持っていましたが、今はそれをSymfonyでビルドしたいと考えています。Doctrineに切り替える:そのようなクエリを実現する方法?
私は、現在の日のためにTasksTableを埋めるために、このようなクエリ文字列を持っていた:
(SELECT id, name, description, time, length
FROM daily
WHERE
(day = DAYNAME(:date)
OR day = 'all'
OR (DAYNAME(:date) IN ('Sunday','Saturday') AND day = 'weekend')
OR (DAYNAME(:date) NOT IN ('Sunday','Saturday') AND day = 'workday'))
AND time IS NOT NULL)
UNION
(SELECT id, name, description,
DATE_FORMAT(date, '%H:%i') as time, length
FROM events
WHERE DATE_FORMAT(date, '%Y-%m-%d') = :date)
ORDER BY time
ご覧のとおり、それは現在の平日(及び平日/週末用)と当日のイベントのための日常のタスクを取得します。 私は2つのDoctrineエンティティ(DailyTaskとEvent)を2つの適切なテーブルに持っており、このクエリをDQLに変換して、クエリの結果としてDailyTasksとEventsを持つ配列を取得したいと考えています。
問題 - そのようなトリックは動作しません:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery("(SELECT id, name, description, time, length
FROM OrganizerBundle:DailyTask
WHERE
(day = DAYNAME(:date)
OR day = 'all'
OR (DAYNAME(:date) IN ('Sunday','Saturday') AND day = 'weekend')
OR (DAYNAME(:date) NOT IN ('Sunday','Saturday') AND day = 'workday'))
AND time IS NOT NULL)
UNION
(SELECT id, name, description,
DATE_FORMAT(date, '%H:%i') as time, length
FROM OrganizerBundle:Event
WHERE DATE_FORMAT(date, '%Y-%m-%d') = :date)
ORDER BY time")->setParameter('date', $day);
を私の知る限り見るように、Doctrineは、このような連合をサポートしていません(それは単にリードする括弧のエラーを示し「(」)、およびように思えます
ここで最善の解決策は何でしょうか?これまでのところ、私はDoctrineを使用することで何のメリットも見られません:(それは物事を難しくしてしまいますMySQLエンジンを使用してPHPで作成できるいくつかのソリューションを使用する(日付フォーマット、条件、注文など)
ありがとうございますが、これはDQLの特異性の問題を解決しません。最初に、ユーザー定義関数DATE_FORMATとDAY_NAMEを追加する必要がありました。次に、各エンティティに対して2つのクエリを使用する必要がありました。 – Audiophile