2014-12-02 27 views
5

Diyelim ki bir Post varlığım ve bir Yorum varlığı var. Bir yorum bir yönetici tarafından onaylanabilir veya alınamaz (db'deki bir bayrak).Symfony2'deki Koşullu İlişki

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $comments; 

Ve ayrıca benzeyecek bir ikinci özelliğinin istiyorum:: post varlık vardır

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $approvedComments; 

Nasıl burada Yalnızca onaylanan yorumlara yüklemek mümkün mü?

+0

Sadece onaylananları yükleyerek mi?Senin problemini anlamıyorum. Nasıl yüklediğiniz hakkında biraz genişletebilir misiniz? Depo? Denetleyici? – Koalabaerchen

+0

Şu anda onaylanmış olanları yüklemiyorum, bunun iyi bir şekilde yapılmasını rica ediyorum. –

cevap

1

1. Fikir

Sen Inheritance mapping kullanabilirsiniz). Sınıf türü ayırımcısını depolayacak ek bir sütuna sahip olmanız gerekecektir.

Sonra olurdu:

/** 
* @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post") 
*/ 
protected $approvedComments; 

/** 
* @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post") 
*/ 
protected $nonApprovedComments; 

bariz olumsuz ek sınıfların yaratılmasıdır.

2. Fikir

Az önce Query/QueryBuilder gibi çimdik olabilir:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE` 

Bu fikir daha makul görünüyor.

1

Tanımladığınız ilişkilerle bu gerçekleştirilemez. İlişkiler birincil anahtarlara dayandığından, 2 tablo "şartlı olarak" ilişkili olamaz.

Burada

  1. az çözümlere, ek açıklamalarla varlık üzerinde "yorum" alanını bırakın ORM anlayacağı gibi yorumlar gibi aynıdır onaylı yorum alanında ek açıklamaları kaldırmak var. Daha sonra tüm yorumları almak için -> getComments() işlevine sahip olursunuz ve onaylanmış olanları almak için repostitory sınıfınızda "getApprovedCommentsForPost ($ post)" işlevini ekleyebilirsiniz.
  2. Tek bir kalıtımı olan yorumları birbirinden ayırabilirsiniz, böylece bir tabloda bir Yorum sınıfı ve bir Onaylılık sınıfı olabilir, örneğin, varlığınızda 2 ilişki kurabilirsiniz (burada oku doctrine-orm.readthedocs.org/en /latest/reference/inheritance-mapping.html#single-table-inheritance)
  3. Yorumlar deposundan veri alınırken Sen
+0

Sağlanan çözümler için, bir soru, bir çözüm, bir kurum içinden bir depo aramak için ilk çözüm hakkında? Bu iyi ya da mümkün olmasa bile .. Nasıl açıklayabilir misiniz? –

+0

Hayır, demek istediğim, yorumları ayrı ayrı almanız. Bu nedenle, önce Post nesnesini Post deposundan alırsınız ve sonra, örneğin, eyleminiz için, $ doctrine-> getRepository ('... Comment') -> getApprovedForPost ($ post) veya -> getApprovedForPosts ($ arrayOfPostIds) –

+0

Aha Şimdi anlıyorum, ancak bu bir performans sorunu yaratacaktır. Bir sayfa için onaylanmış yorumlarıyla birçok gönderiyi almak istiyorum. Diğer iki çözümü şimdi kontrol edin :) –

0

Sen o contraint tanımlayamazsınız varsayılan olarak onaylanmamış bir yorum filtrelemek için doktrin filtreleri kullanabilirsiniz senin varlığın İşte ilgili dokümanlar geçerli: Gördüğünüz gibi

http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany

koşulları ile ilgilidir hiçbir seçeneği yoktur. Bu koşulu QueryBuilder kullanarak tanımlamanız gerekir. ((Onaylanmış ve onaylanmamış) her tip için ayrı sınıflar olması, ancak tek bir tabloda her şeyi saklamak için SINGLE_TABLE miras http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

fikir olacaktır: