在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
我没有测试的代码自己,但它应该传达如何完成的想法。
完美谢谢!我仍然是一个Symfony初学者,并且对这种东西不了解很多,我会尝试在这个领域提高自己:)再次感谢;) –