2014-12-16 3 views
2

У меня есть компания для Компании и юридическое лицо для обзора. Компания имеет несколько обзоров.Doctrine, @oneToMany, но только с активированным полем

Когда я звоню в company->getReviews(), я хочу, чтобы он возвращал ТОЛЬКО отзыв, что поле isValidated - TRUE.

Как я могу это сделать? Какой путь лучше?

/** 
* @ORM\Table(name="Company") 
*/ 
class Company 
{ 

    /** 
    * @ORM\OneToMany(targetEntity="MyAppBundle\Entity\Review", mappedBy="company") 
    */ 
    protected $reviews; 


    /** 
    * Add reviews 
    * 
    * @param \ProSearch\ReviewBundle\Entity\Review $reviews 
    * @return Company 
    */ 
    public function addReview(\ProSearch\ReviewBundle\Entity\Review $reviews) 
    { 
     $this->reviews[] = $reviews; 

     return $this; 
    } 

    /** 
    * Remove reviews 
    * 
    * @param \ProSearch\ReviewBundle\Entity\Review $reviews 
    */ 
    public function removeReview(\ProSearch\ReviewBundle\Entity\Review $reviews) 
    { 
     $this->reviews->removeElement($reviews); 
    } 

    /** 
    * Get reviews 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getReviews() 
    { 
     return $this->reviews; 
    } 

} 

And the review entity : 

/** 
* @ORM\Table() 
* @ORM\Entity() 
*/ 
class Review 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    protected $title; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="description", type="text") 
    */ 
    protected $description; 


    /** 
    * @ORM\ManyToOne(targetEntity="MyAppBundle\Entity\Company") 
    */ 
    protected $company; 



    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="isValidated", type="boolean") 
    */ 
    protected $isValidated; 

} 

ответ

3

Предполагая, что Company::$reviews является доктрина Collection.

Вы можете использовать метод фильтрации в коллекции. Это дает новую коллекцию только с проверенными отзывами.

$companyObj->getReviews()->filter(function($review) { 
    return $review->isValidated(); 
}); 

Видя, как вы отметили это с помощью Symfony. Я бы советовал не изменять Company::getReviews(), потому что он используется в формах при использовании коллекций, например. Это также может быть довольно запутанным, когда другой разработчик хочет получить отзывы от Компании. Вызов getReviews() не вернет результаты, ожидаемые разработчиком.

3

Дело в том, что компания-> getReviews() может использоваться доктриной. Вы Шоуда создать новый метод:

public function getValidatedReviews() { 

    $validatedReviews = array(); 

    foreach($this->getReviews() as $review { 

     if($review->getIsValidated()) 
       $validatedReview[] = $review; 
    } 

    return $validatedReviews; 
} 
Смежные вопросы