【问题标题】:Doctrine query get only the "first" of many related (doing join & select to avoid N+1)教义查询仅获得许多相关的“第一个”(执行连接和选择以避免 N+1)
【发布时间】:2019-02-25 15:24:12
【问题描述】:

在这种情况下,我有 3 个相关实体 profile --OneToMany--> annualReports --ManyToOne--> photo

在一个循环中,对于一张桌子,我正在检查树枝中是否存在这样的照片

{% set is_photo = profile.annualReports.toArray()[0].photo.id is defined %}

所以,profile 可以有很多 annualReports - 这种特殊情况我只想要第一个“报告”。

问题是我如何在QueryBuilder 中做到这一点?即加入“first Report”(“first”可以基于最小id或者createdAt日期)

更新: 我想问题是如何“限制 1”并指定排序?

【问题讨论】:

  • 你的问题我不清楚。但对于您的最后一部分,排序是使用->orderBy() 完成的。要获得更好的树枝,请使用profile.annualReports.first
  • 对不起,orderBy需要应用到连接表。它是 1 个对象、配置文件,并且加入它是许多报告中的“第一个”。
  • 喜欢这个 stackoverflow.com/questions/8161438/… 但在教义/symfony 中
  • 你也可以在previus foreach中添加一个条件而不是定义一个变量,检查twig.symfony.com/doc/2.x/tags/for.html#adding-a-condition

标签: symfony doctrine


【解决方案1】:

如果要获取twig中的第一个报表,只需要使用Collection类的first方法即可:

{% if profile.annualReports IS NOT EMPTY %}
   {% set report = profile.annualReports.first %}
{% endif%}

要管理订单,您必须使用原则注释'@OrderBy': https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#orderby


/**
 * @ManyToMany(targetEntity="Group")
 * @OrderBy({"name" = "ASC"})
 */
private $groups;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2015-11-28
    • 2011-06-23
    相关资源
    最近更新 更多