2017-07-06 16 views
0

私は、フラット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で作成できるいくつかのソリューションを使用する(日付フォーマット、条件、注文など)

答えて

0

最も簡単な方法は、それをサブクエリに移動することです。これは実質的には、ORDER BYを最後の)の外側に置くことによって、既にあなたが行っていることです。

SELECT -- notice how I simply put the SELECT statement outside 
    * -- you're grabbing all of the unioned content. 
FROM 
(
    -- I cleared away your spare `()` from in here and re-indented for clarity. 
    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 
) subqry -- This lets SQL know that all of the above 
     -- needs to be viewed as "one table" 
ORDER BY time 
+0

ありがとうございますが、これはDQLの特異性の問題を解決しません。最初に、ユーザー定義関数DATE_FORMATとDAY_NAMEを追加する必要がありました。次に、各エンティティに対して2つのクエリを使用する必要がありました。 – Audiophile

関連する問題