在Doctrine 2中自动生成JOIN

时间:2012-05-18 14:52:28

标签: join doctrine-orm

Doctrine 2是否支持自动JOIN生成?也就是说,假设我有一个卖方实体与一些产品实体相关联,每个产品实体都有一个类别,做类似的事情

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

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

1 个答案:

答案 0 :(得分:3)

您有两种方法可以自动执行JOIN:

  • 使用急切提取
  • 使用DQL

急切提取意味着每当提取主实体时,Doctrine 2将自动获取任何标记为“eager”的关系。这是通过在映射中使用fetch属性来完成的(请参阅Manual: ManyToOne

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

SELECT m, r FROM My\MainEntity m LEFT JOIN m.relatedEntity r

渴望提取与DQL的好处在于,通过热切提取,您将基本上自动获取该功能。但是,渴望获取的缺点是,如果您实际上没有使用相关实体,则可能会导致性能下降。使用DQL,您始终可以控制您获取的内容和时间。