Как написать UNION в Doctrine 2.0

Как написать этот SQL-запрос в 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

Ответы

Ответ 1

Ну, я нашел, может быть, лучшее решение:

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

И затем два класса (NotificationGroup и NotificationEvent), расширяющие уведомление:

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

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

Ответ 2

UNION не поддерживается в DQL, но вы все равно можете написать запрос UNION и использовать возможности Native Query для извлечения данных:

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

Однако из вашего примера кажется, что вы хотите использовать некоторую форму таблицы для каждого наследования классов, который еще не поддерживается. Существует еще одна форма наследования (Наследование наследования), которая работает, хотя вы можете изменить свою схему.

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

Представление будет еще одним хорошим решением, но тогда это зависит от поставщика вашей базы данных, если он также поддерживает операции записи или нет.

Ответ 3

$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();

Ответ 4

UNION не поддерживается в Doctrine, s. обсуждение здесь.