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

What is the better solution to get the Entity I want in a biderectional OneToMany relation?

我有一个实体 Article 和另一个实体 Image 具有双向关系 OneToMany 和 ManyToOne :

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" 的图像。

最好的解决方案是什么?

在我看来,我可以做这样的事情,但我认为这不是最好的:

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

我想使用类似的东西:

 {{ article.mainImg }}

请问我怎样才能做到这一点?这是最好的解决方案吗?

Doctrine 提供了一个集合过滤机制,你可以使用它来获取 "main image":

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

我没有亲自测试代码,但它应该传达了如何做到这一点的想法。