web-dev-qa-db-ja.com

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
16
Iškuda

まあ、私はおそらく最良の解決策を見つけました:

/**
 * @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 {
    //...
}
13
Iškuda

UNIONはDQLではサポートされていませんが、UNIONクエリを記述し、ネイティブクエリ機能を使用してデータを取得できます。

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

ただし、あなたの例からは、クラス継承ごとに何らかの形式のテーブルを使用したいようですが、これはまだサポートされていません。ただし、スキーマを変更できる場合は、別の形式の継承(Joined Table Inheritance)が機能します。

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

ビューは別の優れたソリューションですが、書き込み操作もサポートするかどうかはデータベースベンダーによって異なります。

11
beberlei

UNIONはDoctrineではサポートされていません。議論 ここ

1
Haim Evgi
$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
Milan Vidovic