2012-09-21 13 views
7

Şimdi bir süredir beynimi bozuyorum. Doktrinde doğru katılma kavramı yoktur. Sol bir birleştirmeyi doğru birleştirme gibi kullanabileceğinizi biliyorum, ama örnek olarak bunu anlayamıyorum, bu yüzden buradayım.Doctrine 'de sağa birleşme gibi birleştirme nasıl kullanılır

Örneğim: Doktrinde, kendisiyle "ebeveyn" adı verilen bire bir ilişkisi olan bir varlığım var. Tüm varlıkları ve çocuklarını (varsa) çoğaltmaları olmadan almaya çalışıyorum. bir hak ile

diyorum çünkü bu basit katılmak:

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

Ama bir sol kullanılarak ben hüküm olması gereken yerde onları filtrelemek için anlamaya olamaz sonuç vermedi am katılmak.

Bu yüzden sorum şu: "Doktrin doğru katılımın bir yolu var mı" veya "Sol birleştirme işlemini doğru birleştirme gibi nasıl kullanabilirim"?

--- DÜZENLEME ---

Sizler ben seçim tabloları sıralamasını değiştirme hakkında neler söylediğini doğru ama ilişki çocuk-> ebeveyn yapar bu yüzden Doctrine kullanıyorum.

Benim Varlık:

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

Öğretişim select ifadesi:

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

Ben tabloları sipariş geçebilirsiniz nasıl ve EĞER emin değilim İşte benim doktrin sorgusu olur. Ayrıca, varlıktan kendisine (ebeveynim gibi) başka bir ilişki kurmaya çalıştım ama çocuk dedim. Fakat db'yi yeni şema doktrini ile güncellediğimde hatalar attı.

Herhangi bir fikrin var mı? Ve hızlı cevaplar için teşekkürler!

--- DÜZENLEME 2 ---

Sol katılmak sql ve sonuçları:

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 

Sağ katılmak sonuçları:

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 

Ben sağ katılmak ile sonuçlar elde etmek istiyorum sql. Birbirine bağlı çocuklarıyla birlikte olan ebeveyn ebeveyn varlıkları (eğer varsa) ama bunu doktrini kullanarak elde etmeliyim. Tekrar teşekkürler!

+4

'child DOĞRU JOIN tableparent ON parent.id = child.parent_id'," tableparent SOL JOIN child ON parent.id = child.parent_id "ile aynıdır. –

+0

Lütfen örnek verileri ve istenen çıktıyı sağlayın. – RedFilter

+0

Eklendi :) Teşekkürler! –

cevap

0

@ 491243 adlı kullanıcının yorumu şöyleyecektir: sql kullanıyor olsaydınız bu, sol ve sağ bağlantılar kolayca dönüştürülebilir ve ilişkisel yüklemlerin herhangi bir sırada ifade edilebilmesi nedeniyle önemsiz bir sorun olurdu.

Asıl sorun, soldaki gibi bir sağ birleştirmeyi nasıl yazacağınız değil, ilişkinizi diğer yönde nasıl geçeceğiniz gibi görünmektedir. Bu

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

bu bir deneyin ?: gibi Tahminen Az önce bir şey yapamaz: WHERE veli:

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

sol Eğer yoktu yayınlanmıştır katılmak.parent_entity_id, null

Verileriniz içinde, bunun kaydın kendisi bir çocuk olmadığı anlamına geleceğini tahmin edeceğim. Sadece hakkını gerekiyorsa

yüzden katılmak bir sola olarak sağlanan sql katılmak, buyur:

SEÇ child.id, child.changed_timestamp, child.parent_entity_id, parent.id, parent.changed_timestamp, veri birden nesiller için izin veriyorsa, örneğin: parent.parent_entity_id içerik ebeveyn SOLDAN parent.parent_entity_id SİPARİŞ parent.id ASC

NOT TARAFINDAN null child.parent_entity_id = parent.id
ÜZERİNE içerik çocuğu KATILIN Büyük çocuklar vs., yukarıdaki fıkra sadece çocukları değil, büyük çocukları da süzüyor. Bunun geri verilen çocuk verisi üzerinde etkileri vardır: Büyük çocuklarsa, çocuklar iade edilmeyecektir. Gerçekten Doktrin komut aşina değil, ama

0

... Bu eski tarz JOIN en SQL komut bir RIGHT JOIN aynı sonucu elde etmelidir:

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

Bu iki ifade eşdeğerdir:

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; 

Hiç DOĞRU JOIN kullanmıyorum. Sadece tamlık için SQL'de yer aldığını düşünüyorum.

İlgili konular