2012-02-22 2 views
0

В Symfony 2 книге есть пример того, как сделать это для ONE $ продукта: http://symfony.com/doc/2.0/book/doctrine.html#fetching-related-objectsFetching объектов, связанных с

Это довольно просто:

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

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

// ... 
} 

Но что, если я хочу, чтобы извлечь все продукты с информацией о категории, которая автоматически присоединяется к каждому проекту?

Спасибо!

ответ

1

Это будет делать трюк:

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

Однако, каждый раз, когда вы делаете getCategory на продукт SQL-запрос срабатывают, который может привести к производительности вопросы.

Что вы действительно хотите сделать, это сделать себя службой ProductManager и написать явный запрос, соединяющий продукт и категорию. Таким образом, будет создан только один sql-запрос. В руководстве Doctrine 2 есть много примеров.

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

+0

Я думал, что Doctrine позволяет сделать это более удобным ... Спасибо вам! – mennanov

0

Вы можете либо перебирать продукты, либо получать категории оттуда. Настройка режима выборки в отношениях может помочь уменьшить количество выполненных запросов.

Однако вы можете просто написать собственный запрос DQL, чтобы получить то, что вам нужно. Это может выглядеть как что-то вроде этого:

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

Можно ли это сделать без написания SQL запроса (DQL ...)? Я имею в виду, что хочу сделать то же самое, что и в примере, без какого-либо дополнительного кода. И если это невозможно, можете ли вы предоставить полный PHP-код для этого? Также я хочу применить некоторые параметры фильтра, такие как «active = 1 AND foo =« bar »». Как их добавить? thx – mennanov

+0

Если вы хотите использовать фильтры, вам нужно написать запрос. Чтобы код был чистым, вам может понадобиться настроить репозиторий. Подробнее см. Http://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2. –

+0

findBy() может помочь с фильтрацией. Но на самом деле, как только вы выйдете за рамки основного материала тумана, вы, вероятно, в конечном итоге напишите свои собственные запросы. Использование построителя запросов Doctrine делает это намного проще, чем использование raw sql. – Cerad

Смежные вопросы