Как написать UNION в Учении 2.0 - PullRequest
14 голосов
/ 11 ноября 2010

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

Ответы [ 4 ]

13 голосов
/ 11 ноября 2010

Ну, я нашел, пожалуй, лучшее решение:

/**
 * @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 {
    //...
}
11 голосов
/ 16 ноября 2010

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

http://doctrine -orm.readthedocs.org / о / последний / ссылка / нативной sql.html

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

http://www.doctrine -project.org / проекты / ОРМ / 2,0 / документы / ссылки / наследование отображения / ан # класса-таблица-наследование

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

1 голос
/ 29 июня 2016
$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();
1 голос
/ 11 ноября 2010

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

...