Join 条令2中的自动连接生成

Join 条令2中的自动连接生成,join,doctrine-orm,Join,Doctrine Orm,条令2是否支持自动连接生成?也就是说,假设我有一个卖方实体,它与一些产品实体相关联,每个产品实体都有一个类别,执行如下操作 $sellers = $entityManager->getRepository('Foo\Bar\Seller')->findBy(array('country' => 'US'), array('populate' => array('Product', 'Product.Category'))); foreach ($sellers as $s

条令2是否支持自动连接生成?也就是说,假设我有一个卖方实体,它与一些产品实体相关联,每个产品实体都有一个类别,执行如下操作

$sellers = $entityManager->getRepository('Foo\Bar\Seller')->findBy(array('country' => 'US'), array('populate' => array('Product', 'Product.Category')));
foreach ($sellers as $seller) {
    doStuffWith($seller->product->category);
}

整个过程只需要一个查询,因为条令会将产品和类别表连接到卖家表,并使用结果预先填充关联。这样做可能吗?

自动执行连接有两种方法:

  • 使用即时抓取
  • 使用DQL
急切抓取意味着,无论何时抓取主实体,原则2都会自动抓取标记为“急切”的任何关系。这是通过在映射中使用
fetch
属性来完成的(请参阅)

使用DQL,您需要编写一个查询来获取主实体和相关实体:

选择m,r从我的\main实体m向左加入m.relatedEntity r


与DQL相比,即时抓取的好处在于,使用即时抓取,您将从本质上自动获得该功能。但是,即时抓取的缺点是,如果不实际使用相关实体,可能会导致性能损失。使用DQL,您始终可以控制获取内容和获取时间。

DQL不是我所说的自动。热切抓取很好(而且似乎是可能的),但据我所知,它仍然会生成一系列查询:而不是加入,它会做一些类似于从卖家那里选择,
SELECT*FROM sellers
SELECT*FROM products WHERE id IN(…)
˙,从id IN(…)的类别中选择,
SELECT*FROM id IN(…)
这还是有点慢。还是我误会了什么?据我所知,一个热切的拜访应该会让你加入。我真的不明白为什么它会使用这样的查询,谢谢!此解决方案(关系上的fetch=“EAGER”)将我的一个页面上的查询数量从111减少到9!很棒的解决方案。从来没有听说过。