2014-05-04 15 views
10

Czy możliwe jest mapowanie asocjacyjne z warunkami w Doctrine 2.4? Mam podmioty artykuł i komentarz. Komentarze muszą zostać zatwierdzone przez administratora. Status zatwierdzenia komentarza jest przechowywany w polu „zatwierdzonej logicznej.Mapowanie skojarzenia Doctrine2 z warunkami

Teraz mam @OneToMany stowarzyszenie mapowanie do komentarzy w jednostce art. odwzorowuje ona wszystkie komentarze. Ale chciałbym mapować tylko zatwierdzonych komentarzy.

Coś jak

@ORM\OneToMany(targetEntity="Comment", where="approved=true", mappedBy="article") 

byłoby bardzo pomocne Niestety AFAIK nie ma czegoś takiego jak gdzie stan w mapowaniu, więc starałem się rozwiązać mój problem z dziedziczenia -.. i stworzył dwie podklasy klasy komentarz teraz mam ApprovedComment i NotApprovedComment i mapowanie dziedziczenia SINGLE_TABLE.

@ORM\InheritanceType("SINGLE_TABLE") 
@ORM\DiscriminatorColumn(name="approved", type="integer") 
@ORM\DiscriminatorMap({1 = "ApprovedComment", 0 = "NotApprovedComment"}) 

Problem polega na tym, że "zatwierdzona" kolumna jest dyskryminująca, nie mogę jej użyć jako pola w podmiocie Komentarz.

Odpowiedz

25

Można użyć API kryteria, aby filtrować the collection:

<?php 

use Doctrine\Common\Collections\Criteria; 

class Article 
{ 

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

    public function getComments($showPending = false) 
    { 
     $criteria = Criteria::create(); 
     if ($showPending !== true) { 
      $criteria->where(Criteria::expr()->eq('approved', true)); 
     } 
     return $this->comments->matching($criteria); 
    } 

} 

Jest to szczególnie miłe, ponieważ doktryna jest wystarczająco inteligentny, aby przejść do bazy danych tylko wtedy, gdy zbiór nie został już załadowany.

+0

Dzięki, nie zdawałem sobie sprawy, że można filtrować na poziomie SQL. Dokładnie tego potrzebuję! :) – Klinki

+0

Nie działa z ManyToMany. Otrzymuję ten błąd: Undefined index: relationshipToSourceKeyColumns. – kieste

+0

Nie próbowałem, ale wyglądem pasowałoby do pracy, której bardzo potrzebuję! –