【问题标题】:Simplifying a query in symfony2简化 symfony2 中的查询
【发布时间】:2012-01-07 18:53:42
【问题描述】:

(我不确定如何使标题更清晰 - 请随意编辑)

我有两张桌子,分别是 wines 和 wineries。每种葡萄酒都有一个酒庄分配给它。
如果我想制作一个包含相应酒庄的所有葡萄酒的清单,我可以这样做:

$entities = $em->getRepository('MyBundle:Wine')->findAll();

和

{% for entity in entities %}
  {{ entity.winery.name }} {{ entity.name }} <br />
{% endfor %}

这个解决方案的问题是,我要阻止的每个酒厂都有一个额外的查询。

我尝试了symfony2 manual 中使用的技术,但我无法让它发挥作用(它是否只适用于单一结果?)。

通常使用 SQL,我会简单地做一个 LEFT JOIN,但我就是不知道如何在 Doctrine2 中完成它。

$qb = $this->createQueryBuilder('w', 'wnr');
$qb->leftJoin('w.winery', 'wnr');
$qb->orderBy('w.name', 'ASC');

$qb->getQuery()->getResult();

???

如果有任何帮助,我将不胜感激!

【问题讨论】:

  • SQL、DQL、自己的方法。所有这些都列在您链接的手册页中。
  • @hakre:但是我以后如何访问它?如果我像这样离开加入,我将无法访问加入的属性。
  • 这取决于您尝试实现的目标。当您使用 ORM 时,您通常不想使用 SQL。因此,请远离 SQL,看看您是否可以使用 DQL 解决您的问题。 DQL 将返回对象。
  • @hakre,我对 Symfony2 和 ORM 还是很陌生。我知道我收到了物品。但正如我向 Kuba 解释的那样,我还不太明白如何在一个查询中获取所需的所有数据。
  • 查询只是返回多个对象,基本上就是这样。

标签: php symfony doctrine-orm


【解决方案1】:

您是否在 DQL 查询中选择了 Winery?

$entities = $em->getRepository('MyBundle:Wine')
    ->createQueryBuilder('w')
    ->select('w, wnr')
    ->leftJoin('w.winery', 'wnr');
    ->getQuery()
    ->getResult();

【讨论】:

  • 我仍然有同样的问题 - 我以后如何访问它?因为如果我尝试访问 wine 上的属性wnr,symfony 会抱怨没有这样的方法。这很好理解,但这是否意味着我必须修改实体本身?
  • @Czechnology:你不对该属性使用getter方法吗?
  • 好吧,我想我终于明白了,或多或少地理解了它。我的大脑仍然有点卡在 SQL 和 DQL 之间。当我在 twig 中使用普通的 winery 属性(这是标准的 getter 方法)时,它只需一个查询就可以很好地工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2018-02-16
  • 2022-01-08
  • 2012-09-20
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多