2011-08-04 17 views
5

Doctrine 2 varlıklarında, sık sık çalışmak zorunda kalacağım kod içerecek bazı ek işlevler eklemek istiyorum. Örneğin:Doctrine 2 Entity Method'da bir kolaylık sorgusu ekleyebilir miyim?

Kullanıcı - Birçok Mesajını
Yayınla var - tek bir kullanıcı zaten bir işlevi $user->getPosts() var

vardır, ama bu benim mesajların hepsi döner.

$user->getPosts()->where('active = true') //if this were possible
ya: Ben gibi olurdu bir $user->getActivePosts(), yazmaya arıyorum Bildiğim kadarıyla söyleyebilirim
$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true)) //if this were more convenient

, Varlık olsa varlık yöneticisine geri almak için hiçbir yolu yoktur kendisi, bu yüzden benim tek seçenek Ancak

class User { 
    function getActivePosts() { 
    $all_posts = $this->getPosts(); 
    $active_posts = new ArrayCollection(); 
    foreach ($all_posts as $post) { 
     if ($post->getActive()) { 
      $active_posts->add($post); 
     } 
    } 
    return $active_posts; 
} 

olurdu, bu benim varlık yöneticisi içine TÜM mesajları yüklemek açmamı gerçekten bunlardan sadece küçük bir alt kümesini istediğinizde, ve PHP filtreleme yapmamı gerektiriyor, ne zaman olurdu SQL katmanında bunu yapmak için daha uygun uch. Varlık içinde ne yapmak istediğimi gerçekleştirmenin herhangi bir yolu var mı, yoksa bunun dışında bir kod oluşturmak zorunda mıyım?

cevap

5

Yöntemi, varlık modelinden çok PostRepository yerine uygulamanız gerektiğini düşünüyorum.

"Modele özgü" yöntemlerin arkasındaki depolardaki tüm model mantığını tutmaya çalışıyorum. Bu şekilde, bir gönderinin etkin olup olmadığını gösterme şeklinizi değiştirirseniz, uygulamanızın etrafına dağılmış olan tüm active = true bildirimlerini bulmak yerine veya "alakasız" bir değişiklik yapmak yerine, yalnızca tek bir yöntemin uygulanmasını değiştirmeniz gerekir. varlık modeli. Doğru bu

PostRepository extends EntityRepository { 
    public function findActiveByUser($user){ 
    // whatever it takes to get the active posts 
    } 
} 
+1

gibi

şey. Bir varlık bir varlık içine koymak eğiliminde olduğunuz zaman, bir geri adım atmanın ve bir hizmette veya bir çeşit depoda ne yapıyorsanız onu düşünmenin zamanı geldiğini biliyorsunuz. OP'nin durumunda, eğer sadece Postalar koleksiyonunu filtrelemek istiyorsa, bunu sadece $ this-> yazılarının üstünden geçirerek ve bir diziyi doldurarak Entity'de yapabilirdi - güzel ve temiz, ancak yükleme/nemlendirme gerektirdiğinden çok verimli değil kullanıcının tüm mesajları. – timdev

+0

PostUpository :: findActiveByUser() öğesinin kendi findActivePosts() yönteminde çağrılması Post Entity için kötü bir uygulama olarak kabul edilir mi? –

İlgili konular