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

时间:2017-08-31 10:00:33

标签: symfony twig repository entity

我有一个实体文章和另一个实体具有双向关系的图像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,
    ));
}

现在我的问题是我想要识别具有属性的唯一图像" main = true"在所有" article.images"我有。

什么是最佳解决方案?

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

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

我想使用类似的东西:

 {{ article.mainImg }}

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

1 个答案:

答案 0 :(得分:2)

Doctrine提供了一个可用于获取“主图像”的集合过滤机制:

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

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