抓取相关的对象
在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();
// ...
}
但是,如果我想获取所有的产品是什么类别信息会自动加入到每个项目中?
谢谢!
这将这样的伎俩:
$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
您可以迭代产品并从中获取类别。调整关系的获取模式可能有助于减少执行的查询量。
但是,您也可以直接编写自定义DQL查询以获取所需内容。它看起来是这样的:
SELECT p, c
FROM AcmeStoreBundle:Product p
INNER JOIN p.category c
能把它无需编写SQL查询来完成(DQL)?我的意思是我想要做的和在这个例子中一样,没有任何额外的代码。 如果这是不可能的,你能否提供一个完整的PHP代码呢?另外我想申请一些过滤器选项,如“活动= 1和foo ='酒吧'”。如何添加它们? thx – mennanov 2012-02-22 17:30:34
如果您想使用过滤器,则必须编写查询。为了保持代码清洁,您可能需要设置存储库。详情请参阅http://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2。 – 2012-02-22 17:33:08
findBy()可以帮助进行过滤。但事实上,只要你超越了基本的薄雾,你最终可能会写出自己的问题。使用Doctrine的查询生成器使得这比使用原始sql更容易。 – Cerad 2012-02-22 17:34:47
我以为教义允许做更多的用户友好...无论如何谢谢! – mennanov 2012-02-22 17:45:17