2012-02-22 79 views
0

在Symfony的2本书里是如何做到这一点的ONE $产品的一个实例:http://symfony.com/doc/2.0/book/doctrine.html#fetching-related-objects抓取相关的对象

这是很简单的:

public function showAction($id) 
{ 
$product = $this->getDoctrine() 
    ->getRepository('AcmeStoreBundle:Product') 
    ->find($id); 

$categoryName = $product->getCategory()->getName(); 

// ... 
} 

但是,如果我想获取所有的产品是什么类别信息会自动加入到每个项目中?

谢谢!

回答

1

这将这样的伎俩:

$products = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')->findAll(); 

但是,每次在产品的SQL查询将被触发,可能导致性能做的getCategory时间的问题。

你真正想要做的是让自己成为一个ProductManager服务,并编写一个明确的查询加入产品和类别。所以只会生成一个sql查询。 Doctrine 2手册有很多例子。

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

+0

我以为教义允许做更多的用户友好...无论如何谢谢! – mennanov 2012-02-22 17:45:17

0

您可以迭代产品并从中获取类别。调整关系的获取模式可能有助于减少执行的查询量。

但是,您也可以直接编写自定义DQL查询以获取所需内容。它看起来是这样的:

SELECT p, c 
FROM AcmeStoreBundle:Product p 
INNER JOIN p.category c 
+0

能把它无需编写SQL查询来完成(DQL)?我的意思是我想要做的和在这个例子中一样,没有任何额外的代码。 如果这是不可能的,你能否提供一个完整的PHP代码呢?另外我想申请一些过滤器选项,如“活动= 1和foo ='酒吧'”。如何添加它们? thx – mennanov 2012-02-22 17:30:34

+0

如果您想使用过滤器,则必须编写查询。为了保持代码清洁,您可能需要设置存储库。详情请参阅http://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2。 – 2012-02-22 17:33:08

+0

findBy()可以帮助进行过滤。但事实上,只要你超越了基本的薄雾,你最终可能会写出自己的问题。使用Doctrine的查询生成器使得这比使用原始sql更容易。 – Cerad 2012-02-22 17:34:47