この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
まあ、私はおそらく最良の解決策を見つけました:
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"group" = "NotificationGroup", "event" = "NotificationEvent"})
*/
class Notification {
// ...
}
そして、2つのクラス(NotificationGroupおよびNotificationEvent)extending Notification:
/**
* @Entity
*/
class NotificationGroup extends Notification {
//...
}
/**
* @Entity
*/
class NotificationEvent extends Notification {
//...
}
UNIONはDQLではサポートされていませんが、UNIONクエリを記述し、ネイティブクエリ機能を使用してデータを取得できます。
http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html
ただし、あなたの例からは、クラス継承ごとに何らかの形式のテーブルを使用したいようですが、これはまだサポートされていません。ただし、スキーマを変更できる場合は、別の形式の継承(Joined Table Inheritance)が機能します。
ビューは別の優れたソリューションですが、書き込み操作もサポートするかどうかはデータベースベンダーによって異なります。
UNION
はDoctrineではサポートされていません。議論 ここ 。
$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();