2010-11-11 28 views
13

Comment écrire cette requête SQL dans Doctrine 2.0 (et récupérer les résultats)?Comment écrire UNION dans 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 

Répondre

13

Eh bien, je l'ai trouvé peut-être la meilleure solution:

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

Et puis deux classes (NotificationGroup et NotificationEvent) extension Avis:

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

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

Et comment est l'explication de cette solution? – ihsan

+0

@ihsan vous sélectionnez dans le référentiel de la classe de base ('Notification') et vous obtenez tous les objets de type sous-classe (' NotificationGroup', 'NotificationEvent', et même simplement' Notification' si vous ne l'avez pas déclaré abstrait). Si vous n'avez besoin que de certains types, vous pouvez utiliser l'opérateur 'INSTANCE OF' dans WHERE. –

1

UNION n'est pas supporté par Doctrine, s. la discussion here.

+0

Oui, je le sais. Et est-il possible de contourner ce problème? –

+1

En tant que solution interm, vous pouvez utiliser une vue pour obtenir le support UNION. –

11

UNION est pas pris en charge DQL, mais vous pouvez toujours écrire une requête UNION et utiliser les fonctionnalités Native Query pour récupérer les données:

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

Cependant de votre exemple, il semble que vous voulez utiliser une certaine forme de tableau par héritage de classe, qui ne sont pas encore pris en charge. Il existe une autre forme d'héritage, (Joined Table Inheritance) qui fonctionne si vous pouvez changer votre schéma.

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

Une vue serait une bonne solution, mais cela dépend de votre fournisseur de base de données si elle prend également en charge les opérations d'écriture ou non.

+3

lien cassé, voici le bon: http://doctrine-orm.readthedocs.org/fr/derniere/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();