2012-02-22 1 views
0

: 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

: 그것은이 같은처럼 보일 수 있습니다 문제.

정말로하고 싶은 것은 ProductManager 서비스를 만들고 상품 및 카테고리에 합류하는 명시 적 쿼리를 작성하는 것입니다. 따라서 하나의 SQL 쿼리 만 생성됩니다. Doctrine 2 매뉴얼에는 많은 예제가 있습니다.

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

+0

Doctrine이 더 사용자 친화적 인 작업을 할 수 있다고 생각했습니다. 어쨌든 감사드립니다! – mennanov

0

제품을 반복하고 거기에서 카테고리를 가져올 수 있습니다. 릴레이션에서 페치 모드를 조정하면 수행되는 쿼리의 양을 줄이는 데 도움이 될 수 있습니다.

그러나 사용자 정의 DQL 쿼리를 작성하여 필요한 것을 얻을 수도 있습니다. 그러나

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

, 당신은 SQL 쿼리 성능을 초래할 수있는 트리거 될 제품에주는 getCategory을 할 때마다 :이 트릭을 할 것입니다

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

SQL 쿼리 (DQL ...)를 작성하지 않고 수행 할 수 있습니까? 내 말은 내가 예제에서와 같이하고 싶다는 뜻이다. 어떤 여분의 코드도 없다. 그리고 가능하지 않다면, 완전한 PHP 코드를 제공해 주시겠습니까? 또한 "활성 = 1 AND foo = 'bar'"와 같은 필터 옵션을 적용하고 싶습니다. 그들을 추가하는 방법? thx – mennanov

+0

필터를 사용하려면 쿼리를 작성해야합니다. 코드를 깨끗하게 유지하려면 저장소를 설정해야 할 수 있습니다. 자세한 내용은 http://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2를 확인하십시오. –

+0

findBy()는 필터링에 도움을 줄 수 있습니다. 그러나 실제로는 미스트 기본 사항을 넘어 서면 결국 자신의 쿼리를 작성하게됩니다. Doctrine의 쿼리 빌더를 사용하면 raw SQL을 사용하는 것보다 훨씬 쉽습니다. – Cerad