在biderectional OneToMany关系中获得我想要的实体的更好的解决方案是什么?

问题描述:

我有一个实体文章,并用bidrectional关系一对多和多对一的其他实体图片:在biderectional OneToMany关系中获得我想要的实体的更好的解决方案是什么?

class Article 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Image", mappedBy="article") 
    */ 
    private $images; 
} 

class Image 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Article", inversedBy="images") 
    * @ORM\JoinColumn(nullable=true) 
    */ 
    private $article; 
} 

在我的控制器中我使用@paramconverter得到我想要的文章:

/** 
* @Route("/blog/{slug}", name="article") 
* @ParamConverter("article", class="AppBundle:Article") 
*/ 
public function articleAction(Article $article) 
{ 
    return $this->render('default/article.html.twig', array(
     'article' => $article, 
    )); 
} 

现在我的问题是我想在所有“article.images”中标识具有“main = true”属性的唯一图像。

什么是最佳解决方案?

在我wiew我能做服用点喜欢这一点,但它不是最好的,我认为:

{% for image in article.images %} 
    {% if image.main %} 
     <img src="{{ asset(image.src) }}" alt="{{ image.alt }}" title="{{ image.title }}"> 
    {% endif %} 
{% endfor %} 

我想使用类似:

{{ article.mainImg }} 

我如何能实现这个好吗?这是最好的解决方案吗?

学说提供了一个收集过滤机制,你可以用它来获得“主图像”:在过滤学说收藏

public function articleAction(Article $article) 
{ 
    $criteria = Criteria::create() 
     ->where(Criteria::expr()->eq("main", true)) 
     ->setMaxResults(1); 

    $mainImg = $article->getImages()->matching($criteria)->first(); 
    return $this->render('default/article.html.twig', array(
     'article' => $article, 
     'mainImg' => $mainImg 
    )); 
} 

的更多信息:Filtering collections

我没有测试的代码自己,但它应该传达如何完成的想法。

+0

完美谢谢!我仍然是一个Symfony初学者,并且对这种东西不了解很多,我会尝试在这个领域提高自己:)再次感谢;) –