2010-11-11 27 views
13

Cách viết truy vấn SQL này trong Doctrine 2.0 (và tìm nạp kết quả)?Cách viết UNION trong 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 

Trả lời

13

Vâng, tôi thấy có lẽ là giải pháp tốt nhất:

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

Và sau đó hai lớp (NotificationGroupNotificationEvent) mở rộng Notification:

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

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

Và giải thích cho giải pháp này như thế nào? – ihsan

+0

@ihsan bạn chọn từ kho lưu trữ lớp cơ sở ('Notification') và bạn nhận được tất cả các đối tượng có loại phân lớp (' NotificationGroup', 'NotificationEvent', và thậm chí chỉ là' Notification' nếu bạn chưa khai báo nó trừu tượng). Nếu bạn chỉ cần một số loại nhất định, thì bạn có thể sử dụng toán tử 'INSTANCE OF' trong WHERE. –

1

UNION không được hỗ trợ trong Doctrine, s. cuộc thảo luận here.

+0

Vâng tôi biết điều đó. Và có cách nào khác không, để làm điều này? –

+1

Là giải pháp interm, bạn có thể sử dụng VIEW để nhận hỗ trợ UNION. –

11

UNION không được hỗ trợ trong DQL, nhưng bạn vẫn có thể viết truy vấn UNION và sử dụng khả năng Truy vấn Gốc để truy xuất dữ liệu:

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

Tuy nhiên từ ví dụ của bạn có vẻ như bạn muốn sử dụng một số hình thức của bảng mỗi thừa kế lớp, mà chưa được hỗ trợ. Có một dạng thừa kế khác, (Inheritance Inheritance Table) đã hoạt động, nếu bạn có thể thay đổi lược đồ của bạn.

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

Một quan điểm sẽ là một giải pháp tốt, nhưng sau đó nó phụ thuộc vào nhà cung cấp cơ sở dữ liệu của bạn nếu nó cũng hỗ trợ ghi các hoạt động hay không.

+3

liên kết bị hỏng, đây là liên kết tốt nhất: http://doctrine-orm.readthedocs.org/en/latest/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();