2010-11-11 17 views
13

Come scrivere questa query SQL in Doctrine 2.0 (e recuperare i risultati)?Come scrivere UNION in 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 

risposta

13

Beh, ho trovato forse la soluzione migliore:

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

E poi due classi (NotificationGroup e NotificationEvent) che si estende Notifica:

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

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

E come si spiega questa soluzione? – ihsan

+0

@ihsan tu selezioni dal repository della classe base ('Notifica') e ottieni tutti gli oggetti di questo tipo di sottoclasse (' NotificationGroup', 'NotificationEvent', e anche solo' Notifica' se non lo hai dichiarato astratto). Se hai bisogno solo di alcuni tipi, allora puoi usare l'operatore 'INSTANCE OF' in WHERE. –

1

UNION non è supportato in Doctrine, s. la discussione here.

+0

Sì, lo so. E c'è qualche soluzione, per fare questo? –

+1

Come soluzione interm, è possibile utilizzare una VISUALIZZAZIONE per ottenere il supporto UNION. –

11

UNION non è supportato in DQL, ma è comunque possibile scrivere una query UNION e utilizzare le funzionalità di Query nativa per recuperare i dati:

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

Tuttavia dal vostro esempio sembra che si desidera utilizzare una qualche forma di tabella per ogni classe di eredità, che non è ancora supportato. Esiste un'altra forma di ereditarietà, (Eredità della tabella unita) che funziona comunque, se è possibile modificare lo schema.

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

Una vista sarebbe un'altra buona soluzione, ma poi dipende dal vostro fornitore di database se supporta anche le operazioni di scrittura o meno.

+3

collegamento interrotto, qui il buono: 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();