2012-09-21 21 views
7

Vì vậy, tôi đã bỏ lỡ bộ não của mình một thời gian. Trong Doctrine không có khái niệm về việc tham gia đúng. Tôi biết rằng bạn có thể sử dụng một tham gia trái như một tham gia đúng nhưng tôi không thể tìm ra nó cho ví dụ của tôi đó là lý do tại sao tôi ở đây.Cách sử dụng phép nối trái giống như tham gia ngay trong Doctrine

Ví dụ của tôi: Tôi có một thực thể trong Học thuyết có mối quan hệ một-một với chính nó được gọi là "cha mẹ". Tôi đang cố gắng để có được tất cả các thực thể và con cái của họ (nếu chúng tồn tại) mà không có bản sao.

Với quyền tham gia này là đơn giản bởi vì tôi có thể nói:

SELECT parent.*, child.* 
    FROM table child 
    RIGHT JOIN table parent ON parent.id = child.parent_id 
    WHERE parent.parent_id is null; 

Nhưng sử dụng một trái tham gia Tôi trả lại kết quả mà tôi không thể tìm ra những gì mệnh đề where nên để lọc chúng ra.

Vì vậy, câu hỏi của tôi là "Học thuyết có một cách để làm đúng tham gia" hay "Làm cách nào tôi có thể sử dụng thao tác tham gia bên trái như tham gia đúng"?

--- EDIT ---

Các bạn là chính xác những gì bạn đang nói về việc thay đổi thứ tự của bảng tôi lựa chọn tuyệt vời nhưng tôi sử dụng Doctrine, vì vậy các mối quan hệ làm từ trẻ> mẹ. Đây là câu hỏi học thuyết của tôi:

My Entity:

/** 
* @Entity 
* @Table(name="entity") 
*/ 
class Entity 
{ 
... 
/** 
* @OneToOne(
*  targetEntity="Entity", 
*  fetch="EAGER" 
*) 
* @JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
private $parent; 
... 
} 

Ðạo của tôi lựa chọn công bố:

$em->createQueryBuilder() 
->select(array('child', 'parent')) 
->from('Entity', 'child') 
->leftjoin('child.parent', 'parent') 
->orderBy('parent.id','asc') 
->getQuery() 
->execute(); 

Tôi không chắc chắn như thế nào và nếu tôi có thể chuyển đổi thứ tự của bảng. Tôi cũng đã cố gắng tạo ra một mối quan hệ khác từ thực thể cho chính nó (giống như cách tôi đã làm cha mẹ) nhưng gọi nó là con. Nhưng khi tôi cập nhật db với lược đồ lược đồ mới đã ném lỗi.

Bất kỳ ý tưởng nào? Và Cảm ơn bạn đã phản hồi nhanh!

--- EDIT 2 ---

Left tham gia sql và kết quả:

SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id, 
    parent.changed_timestamp, parent.parent_entity_id 
FROM content child 
LEFT JOIN content parent ON child.parent_entity_id = parent.id 
ORDER BY parent.id ASC 

child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 
1   8/16/12 20:29 NULL    NULL  NULL    NULL 
7   9/20/12 16:07 NULL    NULL  NULL    NULL 
8   8/17/12 16:08 NULL    NULL  NULL    NULL 
9   8/17/12 20:44 NULL    NULL  NULL    NULL 
10   8/17/12 21:03 NULL    NULL  NULL    NULL 
11   8/17/12 21:17 NULL    NULL  NULL    NULL 
194   9/19/12 9:58 NULL    NULL  NULL    NULL 
195   9/20/12 10:38 NULL    NULL  NULL    NULL 
196   9/19/12 11:58 NULL    NULL  NULL    NULL 
197   NULL   196     196   9/19/12 11:58  NULL 
200   9/20/12 16:02 1     1   8/16/12 20:29  NULL 
202   9/20/12 16:35 NULL    NULL  NULL    NULL 
204   9/21/12 8:41 NULL    NULL  NULL    NULL 
206   NULL   204     204   9/21/12 8:41  NULL 

tham gia phải kết quả:

SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id, 
parent.changed_timestamp, parent.parent_entity_id 
FROM content child 
RIGHT JOIN content parent ON child.parent_entity_id = parent.id 
WHERE parent.parent_entity_id is null 
ORDER BY parent.id ASC 

child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 
200   9/20/12 16:02 1     1   8/16/12 20:29  NULL 
NULL  NULL   NULL    7   9/20/12 16:07  NULL 
NULL  NULL   NULL    8   8/17/12 16:08  NULL 
NULL  NULL   NULL    9   8/17/12 20:44  NULL 
NULL  NULL   NULL    10   8/17/12 21:03  NULL 
NULL  NULL   NULL    11   8/17/12 21:17  NULL 
NULL  NULL   NULL    194   9/19/12 9:58  NULL 
NULL  NULL   NULL    195   9/20/12 10:38  NULL 
197   NULL   196     196   9/19/12 11:58  NULL 
NULL  NULL   NULL    202   9/20/12 16:35  NULL 
206   NULL   204     204   9/21/12 8:41  NULL 

Tôi muốn đạt được kết quả với quyền join sql. Các thực thể cha mẹ độc đáo với các con liên kết của chúng (nếu chúng tồn tại) nhưng tôi cần đạt được nó bằng cách sử dụng học thuyết. Cảm ơn một lần nữa!

+4

'con QUYỀN THAM GIA tableparent TRÊN parent.id = child.parent_id' giống với' tableparent LEFT JOIN child ON parent.id = child.parent_id' –

+0

Vui lòng cung cấp dữ liệu mẫu và đầu ra mong muốn. – RedFilter

+0

Đã thêm :) Cảm ơn! –

Trả lời

0

@ comment 491.243 là đúng: nếu bạn đang sử dụng sql đây sẽ là một vấn đề tầm thường vì trái và phải tham gia có thể dễ dàng chuyển đổi các vị từ và quan hệ có thể được thể hiện bằng bất kỳ thứ tự.

Vấn đề thực sự xuất hiện không phải là cách viết lại một sự tham gia phù hợp như bên trái mà là cách đi qua mối quan hệ của bạn theo một hướng khác. Có lẽ bạn không thể chỉ làm một cái gì đó như thế này ?:

$em->createQueryBuilder() 
->select(array('child', 'parent')) 
->from('Entity', 'parent') 
->leftjoin('parent.child', 'child') 
->orderBy('parent.id','asc') 
->getQuery() 
->execute(); 
0

thử cái này:

SELECT 
    parenttable.*, childtable.* 
FROM childtable 
RIGHT JOIN parenttable ON parenttable.id = childtable.parent_id 
WHERE 
    parenttable.parent_id IS NULL 
    AND 
    childtable.childid IS NOT NULL; 
0

trái tham gia bạn được đăng không có: WHERE mẹ.parent_entity_id is null

tôi sẽ đoán rằng trong dữ liệu của bạn, điều này có nghĩa là bản ghi không phải là một đứa trẻ.

vì vậy nếu bạn chỉ cần bên phải tham gia sql mà bạn cung cấp như một trái tham gia, here you go:

CHỌN child.id, child.changed_timestamp, child.parent_entity_id, parent.id, parent.changed_timestamp, parent.parent_entity_id TỪ tRÁI mẹ nội dung THAM GIA đứa trẻ nội dung ON child.parent_entity_id = parent.id
ĐÂU parent.parent_entity_id là null ORDER BY parent.id ASC

Chú ý: nếu dữ liệu của bạn cho phép cho nhiều thế hệ, ví dụ grand-children vv, mệnh đề where ở trên là lọc ra không chỉ trẻ em, mà còn là cháu lớn. Điều này có ý nghĩa đối với dữ liệu con được trả về: trẻ sẽ không được trả lại nếu chúng là con cháu.

0

Không thực sự quen thuộc với học thuyết kịch bản, nhưng ... kiểu cũ JOIN này nên đạt được kết quả tương tự như một RIGHT JOIN trong hầu hết các kịch bản SQL:

SELECT parent.*, child.* 
    FROM table child, table parent 
    WHERE parent.id = child.parent_id 
    OR child.parent_id IS NULL; 
0

Hai báo cáo là tương đương:

SELECT parent.*, child.* 
FROM table child 
RIGHT JOIN table parent ON parent.id = child.parent_id 
WHERE parent.parent_id is null; 

SELECT parent.*, child.* 
FROM table parent 
LEFT JOIN table child ON child.parent_id = parent.id 
WHERE parent.parent_id is null; 

Tôi không bao giờ sử dụng RIGHT JOIN. Tôi nghĩ rằng nó chỉ được bao gồm trong SQL cho đầy đủ.

Các vấn đề liên quan