2010-11-11 14 views
13

Jak napisać to zapytanie SQL w Doctrine 2.0 (i pobrać wyniki)?Jak napisać UNION w Doctrine 2.0

(SELECT 'group' AS type, CONCAT(u.firstname, " ", u.surname) as fullname, g.name AS subject, user_id, who_id, group_id AS subject_id, created FROM group_notification JOIN users u ON(who_id = u.id) JOIN groups g ON(group_id = g.id)) 
    UNION 
(SELECT 'event' AS type, CONCAT(u.firstname, " ", u.surname) as fullname, e.name AS subject, user_id, who_id, event_id AS subject_id, created FROM event_notification JOIN users u ON(who_id = u.id) JOIN events e ON(event_id = e.id)) 
ORDER BY created 

Odpowiedz

13

Cóż, znalazłem być może najlepsze rozwiązanie:

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"group" = "NotificationGroup", "event" = "NotificationEvent"}) 
*/ 
class Notification { 
    // ... 
} 

A potem dwie klasy (NotificationGroup i NotificationEvent) rozciągające Notification:

/** 
* @Entity 
*/ 
class NotificationGroup extends Notification { 
    //... 
} 

/** 
* @Entity 
*/ 
class NotificationEvent extends Notification { 
    //... 
} 
+10

A jak jest wytłumaczenie tego rozwiązania? – ihsan

+0

@ihsan wybierzesz z repozytorium klasy podstawowej ("Powiadomienie") i otrzymasz wszystkie obiekty tego typu podklasy ('NotificationGroup',' NotificationEvent', a nawet po prostu 'Notification', jeśli nie zadeklarowałeś tego jako abstrakcyjnego). Jeśli potrzebujesz tylko niektórych typów, możesz użyć operatora 'INSTANCE OF' w GDZIE. –

1

UNION nie jest obsługiwana w doktrynie, s. dyskusja here.

+0

Tak, wiem to. I czy istnieje jakieś obejście tego problemu? –

+1

Jako rozwiązanie pośrednie możesz użyć WIDOKU, aby uzyskać wsparcie dla UNION. –

11

Unia nie jest obsługiwana w DQL, ale nadal możesz napisać zapytanie UNION i użyć funkcji Native Query w celu pobrania danych:

http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html

Jednak z przykładu wydaje chcesz użyć jakąś formę tabeli w grupie dziedziczenia, który nie jest jeszcze obsługiwany. Istnieje również inna dziedziczona dziedziczność (połączona z dziedziczeniem tabel), jeśli możesz zmienić swój schemat.

http://www.doctrine-project.org/projects/orm/2.0/docs/reference/inheritance-mapping/en#class-table-inheritance

Widok byłby kolejnym dobrym rozwiązaniem, ale to zależy od Twojego dostawcy bazy danych, czy też obsługuje operacje zapisu lub nie.

+3

link uszkodzony, tutaj dobry: http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html –

2
$connection = $em->getConnection(); 
$query = $connection->prepare("SELECT field1, field2 FROM table1 
           UNION 
           SELECT field3, field4 FROM table2 
           UNION 
           SELECT field5, field6 FROM table3 
           "); 
$query->execute(); 
$result = $query->fetchAll();