Can't you just make the one-to-many self-referencing association load "EXTRA_LAZY", only iterate over the loaded (root) categories and not over the subCategories?
Next to that, I don't see a problem with your approach... Cheers On Sep 26, 2014 7:52 PM, "Javier Garcia" <[email protected]> wrote: > Hi, > > I have a Category-Subcategories relationship, that is a 1:m relationship > self-referencing. Besides, each Category or Subcategory can have different > Products (1:m). > > *1:m self-referencing:* > http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many-self-referencing > *1:m: * > http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many-bidirectional > > My question: how to retrieve only the categories but not the subcategories > and viceversa? Below there is my approach, that I consider not very > smart..do you consider it is smart enough? is there any smarter way to do > it? > > *NOTE*: Item=Category, Subitem=Product > > > public function categoryListAction(Request $request) > { > $repository = $this->getDoctrine()->getRepository( > 'ProjectFrontendBundle:Item'); > > $qb = $repository->createQueryBuilder('i') > ->where('i.parent IS NULL') > ->getQuery(); > $items = $qb->getResult(); > > > return $this->render( > 'ProjectBackendBundle:Default:item_list.html.twig', array('items' => > $items)); > } > > public function subcategoryListAction(Request $request, $id) > { > $repository = $this->getDoctrine()->getRepository( > 'ProjectFrontendBundle:Item'); > > $qb = $repository->createQueryBuilder('i') > ->where('i.parent = :parent') > ->setParameter('parent', $id) > ->getQuery(); > $items = $qb->getResult(); > > return $this->render( > 'ProjectBackendBundle:Default:item_list.html.twig', array('items' => > $items)); > } > > public function subitemListAction($id) > { > $repository = $this->getDoctrine()->getRepository( > 'ProjectFrontendBundle:Item'); > > $category = $repository->find($id); > $products = $category->getSubItems(); > > return $this->render( > 'ProjectFrontendBundle:Default:list-products.html.twig', array('products' > => $products)); > } > > > This is the view (twig), that I don't like too much because those "ifs". > > {% for item in items %} > {% if item.subitems is empty %} > <a href="{{ path('project_backend_subcategory_list', {'id': item.id }) > }}">{{ item.name }}</a> > {% endif %} > {% if item.subitems is not empty %} > <a href="{{ path('project_backend_subitem_list', {'id': item.id }) }}" > >{{ item.name }}</a> > {% endif %} > <!-- --> > {% endfor %} > > And this is the routing: > > project_backend_category_list: > path: /category/list > defaults: { _controller: ProjectBackendBundle:Default:categoryList } > > project_backend_subcategory_list: > path: /subcategory/list/{id} > defaults: { _controller: ProjectBackendBundle:Default:subcategoryList > } > > project_backend_subitem_list: > path: /subitem/list/{id} > defaults: { _controller: ProjectBackendBundle:Default:subitemList } > > > Let me know if this is a question for the doctrine google group, but since > there are view and routing code I prefered to ask here. > > -- > You received this message because you are subscribed to the Google Groups > "doctrine-user" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/doctrine-user. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "doctrine-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/doctrine-user. For more options, visit https://groups.google.com/d/optout.
