Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/11/2010, 15:02
gdb7
 
Fecha de Ingreso: abril-2003
Ubicación: Córdoba
Mensajes: 160
Antigüedad: 21 años, 7 meses
Puntos: 0
Pregunta relaciones doctrine

Buenas,

estoy tratando de hacer una consulta DQL, con doctrine obvio.

Tengo dos modelos relacionados en muchos-a-muchos de la siguiente forma:

Código:
Category:
  columns:
    id: ....
    parent_id: ...
    .....
  indexes:
    category_parent:
      fields: [parent_id]
  relations:
    Items:
      class: Item
      refClass:CategoryItem
      local: category_id
      foreign: item_id

Item:
  columns:
    id: ...
     ...
  relations:
    Categories:
      class: Category
      refClass: CategoryItem
      local: item_id
      foreign: category_id

CategoryItem:
  columns:
    category_id:
      type: integer(4)
      primary: true
    item_id:
      type: integer(8)
      primary: true

Y lo que quiero es traer todos los items que pertenezcan a la categoria id=2 o categorias con el parent_id=2 (es decir items dentro de la categoria 2 o categorias hijas de la 2)

El DQL que estoy tratando de utilizar es asi:

Código:
$q = Doctrine_Query::create() 
      ->from('Item i') 
      ->select('i.*, c.name') 
      ->leftJoin('i.Categories c') 
      ->andWhere( 'i.is_active = ?', 1) 
      ->andWhere('(c.id = ? OR c.parent_id = ?)', array(2, 2));
lo que me devuelve el siguiente SQL

Código SQL:
Ver original
  1. SELECT p.id AS p__id, ..., p2.id AS p2__id, p2.name AS p2__name
  2. FROM item p
  3. LEFT JOIN category_item p3 ON (p.id = p3.item_id)
  4. LEFT JOIN category p2 ON p2.id = p3.category_id
  5. WHERE (p.is_active = '1' AND (p2.id = '2' OR p2.parent_id = '2'))

Lo que estaía bien!, eh ahora la cuestion! cuando le intento agregar un LIMIT
->limit(10)

Me realiza dos consultas, lo que no me gusta nada:

Código SQL:
Ver original
  1. #1
  2. SELECT DISTINCT p4.id
  3. FROM item p4
  4. LEFT JOIN category_item p6 ON (p4.id = p6.item_id)
  5. LEFT JOIN category p5 ON p5.id = p6.category_id
  6. WHERE p4.is_active = '1' AND (p5.id = '2' OR p5.parent_id = '2') LIMIT 10
  7.  
  8. #2
  9. SELECT p.id AS p__id,...., p2.id AS p2__id, p2.name AS p2__name
  10. FROM item p
  11. LEFT JOIN category_item p3 ON (p.id = p3.item_id)
  12. LEFT JOIN category p2 ON p2.id = p3.category_id WHERE p.id IN ('5843', '5853') AND (p.is_active = '1' AND (p2.id = '2' OR p2.parent_id = '2'))

Porque? y porque cuando le agrego el limit?

algún guru?

Gracias
__________________
-----------------
_
__|_|__
º(-_-)º