Foros del Web » Programando para Internet » PHP » Symfony »

relaciones doctrine

Estas en el tema de relaciones doctrine en el foro de Symfony en Foros del Web. 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: ...
  #1 (permalink)  
Antiguo 03/11/2010, 15:02
 
Fecha de Ingreso: abril-2003
Ubicación: Córdoba
Mensajes: 160
Antigüedad: 21 años
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
__________________
-----------------
_
__|_|__
º(-_-)º
  #2 (permalink)  
Antiguo 03/11/2010, 15:16
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: relaciones doctrine

te fijaste que estas en el foro de PHP cierto ?


espera a que muevan tu tema al foro correspondiente para que puedan ayudarte ;)
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 03/11/2010, 15:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Tema movido desde PHP a PHP orientado a objetos
  #4 (permalink)  
Antiguo 03/11/2010, 15:53
 
Fecha de Ingreso: abril-2003
Ubicación: Córdoba
Mensajes: 160
Antigüedad: 21 años
Puntos: 0
Respuesta: relaciones doctrine

OK gracias, es que habia leido un post sobre doctrine que lo habian pasado de orientado a objetos a PHP 8-)

Espero respuestas!
Slds
__________________
-----------------
_
__|_|__
º(-_-)º
  #5 (permalink)  
Antiguo 05/11/2010, 09:24
Avatar de historiasdemaria  
Fecha de Ingreso: septiembre-2010
Ubicación: www
Mensajes: 433
Antigüedad: 13 años, 6 meses
Puntos: 54
Respuesta: relaciones doctrine

Creo que tal vez debas revisar el fichero yaml, en la forma de definir la relacion Many To Many,

mira este ejemplo:


Código C++:
Ver original
  1. User:
  2.   columns:
  3.     id:
  4.       type: integer(4)
  5.       autoincrement: true
  6.       primary: true
  7.     username:
  8.       type: string(255)
  9.     password:
  10.       type: string(255)
  11.   attributes:
  12.     export: all
  13.     validate: true
  14.  
  15. Group:
  16.   tableName: group_table
  17.   columns:
  18.     id:
  19.       type: integer(4)
  20.       autoincrement: true
  21.       primary: true
  22.     name:
  23.       type: string(255)
  24.   relations:
  25.     Users:
  26.       foreignAlias: Groups
  27.       class: User
  28.       refClass: GroupUser
  29.  
  30. GroupUser:
  31.   columns:
  32.     group_id:
  33.       type: integer(4)
  34.       primary: true
  35.     user_id:
  36.       type: integer(4)
  37.       primary: true
  38.   relations:
  39.     Group:
  40.       foreignAlias: GroupUsers
  41.     User:
  42.       foreignAlias: GroupUsers

Este ejemlo aparece en la documentacion, intenta ver si el modelo se adapta,
a ver que tal
;)

Etiquetas: doctrine
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:18.