Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ayuda con "ORM" por favor !

Estas en el tema de Ayuda con "ORM" por favor ! en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos! Estoy estudiando sobre POO y la relacion entre objetos (y como representar las relaciones entre tablas). Por lo que estuve leyendo mi ...
  #1 (permalink)  
Antiguo 27/06/2008, 20:01
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Exclamación Ayuda con "ORM" por favor !

Hola a todos!

Estoy estudiando sobre POO y la relacion entre objetos (y como representar las relaciones entre tablas). Por lo que estuve leyendo mi problema esta relacionado con "ORM".

La verdad entiendo perfecto la teoria, lei bastante y todo va bien pero cuando me siento en la PC y paso a la práctica aparecen mis dudas...

Para practicar arme un sistema super simplificado: NOTICIAS y COMENTARIOS...

En mi base de datos tenga estas dos tablas, con una relacion tipica y simple:

Código:
NOTICIAS
-id_noticia
-titulo
-cuerpo

COMENTARIOS_X_NOTICIAS
-id_comentario
-id_noticia
-titulo
-cuerpo

En el plano de la programación, los objetos, tengo lo siguiente:

Objeto "adm_noticia" que aplica el patron ActiveTable
Objeto "noticia" que aplica el patron ActiveRecord


"adm_noticia" puede buscar todas las noticias y armar un array de objetos de tipo "noticia".
Este objeto se encarga de OPERAR en la BD: consultar, crear, actualizar, borrar.

"noticia" tiene un array con todas sus propiedades -> valores (campos de BD).
Todo objeto de este tipo depende necesariamente de un objeto "adm_noticia" para poder actualizarse, eliminarse, duplicarse, etc.


Hasta este punto está todo bien... yo puedo crear un listado de noticias y para cada caso imprimir FECHA, TITULO, CUERPO.

Ahora se me presenta un problema en cuanto a relaciones... ¿como integro los comentarios?


Mi primer aproach es repetir el modelo anterior y luego buscar cómo lo relaciono:

"adm_comentario" me permite buscar los comentarios para una noticia especifica, crear objetos de tipo "comentario" y rellenarlos.

"comentario" contiene toda la información de un comentario (titulo, cuerpo y a qué noticia pertenece).
Depende necesariamente de un objeto "adm_comentario".

"noticia" este objeto ahora tiene un array de objetos tipo "comentario".


Esto parece razonable, pero me preocupa que a simple vista pedir una noticia tenga que necesariamente involucrar el pedido de los comentarios de la misma. Y si yo quiero listar 100 noticias y solo quiero el NUMERO de comentarios para cada una, no quiero pedir los comentarios propiamente dichos... (¿esto se llama carga retardada, puede ser?).


Les paso cual es mi aproach, ante nada:

- El "adm_noticia" crea un objeto de tipo "adm_comentario" y por medio de él crea objetos de tipo "comentario" y se los carga a los objetos tipo "noticia".

- Cada objeto "comentario" depende a su vez necesariamente de un "adm_comentario" para realizar operaciones.


Entonces, si tengo que listar NOTICIAS y quiero para cada caso mostrar:

FECHA -TITULO - CUERPO - NRO. de COMENTARIOS

"adm_noticia" --- GENERA ---> "noticia"

"adm_noticia" --- GENERA ---> "adm_comentario"

"adm_noticia->adm_comentario" --- GENERA ---> "noticia->comentario[n]"

Creo que esto lo puedo programar... pero AHORA me cuelga que pasa si yo quiero alterar el CUERPO de un comentario ¿tendria que cargar TODO el arbol hasta llegar al "comentario"? es decir... ¿tendria que cargar todos los objetos con sus relaciones hasta llegar al comentario, para poder hacer "comentario->update();"?


Bueno, espero haber podido ser medianamente claro, les pido disculpas pero la verdad estoy algo mareado ya con este tema.

Espero me puedan ayudar, con que me tiren una punta con la cual yo pueda investigar ya voy a estar agradecido!!!


Un saludo y GRACIAS de antemano !!!
  #2 (permalink)  
Antiguo 27/06/2008, 22:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ayuda con "ORM" por favor !

Hola Computer XTress,

Recuerda que tu modulo de comentarios también debe de ser capaz de seleccionar un comentario solamente, por lo que no es necesario que cargues todo el arbol.

La idea de las relaciones es que puedas hacer algo asi:
Código PHP:
$noticia NoticiasPeer::findByPk); // obtenemos la noticia 1
$comentarios $noticia->getComments();
$totalNoticias count$comentarios );
// o
$totalNoticas $noticia->totalComentarios();

$comentarioEspecifico $comentarios[4];
$comentarioEspecifico['comentario'] = "muy bien!";
$comenatrioEspecifico->update();

// o
$comentarioEspecifico ComentariosPeer::findByPk);
$comentarioEspecifico['comentario'] = "muy bien!";
$comenatrioEspecifico->update(); 
Saludos.
  #3 (permalink)  
Antiguo 28/06/2008, 01:37
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: Ayuda con "ORM" por favor !

Hola Gator, gracias por tu respuesta.

Claro, entiendo el punto. Sí, de la forma en que lo planteo puedo manejar comentarios de forma independiente como vos mencionas.

Ahora que lo pienso bien, el problema que tengo en realidad es el siguiente...

Para el caso que yo expongo y mismo para el ejemplo que vos me das tendria que hacer dos consultas:

1 para pedir las noticias y 1 más para pedir los comentarios de esa noticia...

¿Qué pasa si quiero hacer solo una consulta? Por ejemplo "selecte * from noticias, comentarios where noticia.fecha = xx-xx-xx and comentario.id_noticia = noticia.id_noticia.

ESO es lo que no puedo hallar ó encajar en toda esta lógica...

Mira, por ejemplo, yo tengo una clase que arme con el patron ActiveTable en la que tengo un metodo que pide registros así:

Código PHP:
    public function findByField($field$value$compare '='$from=0$to=0) {

        
$sql "SELECT * FROM `%s` WHERE `%s` %s '%s'";
        
$sql sprintf($sql$this->table$field$compare$value);

        if (
$to != 0) {
            
$sql .= " LIMIT %s, %s";
            
$sql sprintf($sql$from$to);
        }

        
$query $this->_db->prepare();
        
$query->execute($sql);

        
$result = array();
        
$obj $this->resultObj;

        while (
$data $query->fetch()) {
            
$result[] = new $obj($data$this);
        }

        
$this->numRegs $query->numrows();
        
$query->free();

        return 
$result;
    } 
Mi "adm_noticias" es una clase extendida de esta... y si yo quiero consultar haciendo un join con la tabla de comentarios tendría que dejar de usar este metodo, crearía un metodo en la clase "adm_noticias" que haga casi lo mismo que este metodo que estoy poniendo, pero con el inner join...

Yo quisiera tener un metodo en la clase padre que me permita hacer consultas a más de una tabla... ya que este objeto "NOTICIA" en realidad tiene propiedades en más de una tabla... "comentarios" sería una propiedad de "NOTICIA" ¿verdad?

AQUI es a donde hago agua... no se bien como manejarlo, no se me ocurre que inventar ó por donde buscar la solución para estos casos, que sinceramente, creo que es algo muy cotidiano... por lo que leí es uno de los problemas que se plantean de BASE en todo sistema pero tal vez ya tengo el cerebro frito y no puedo comprender como solucionarlo :S:S:S:S

Te agradezco por la ayuda Gator, un saludo grande!!!
  #4 (permalink)  
Antiguo 28/06/2008, 08:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ayuda con "ORM" por favor !

El problema es tu relacion 1:m, ya que si tu haces un join de una noticia, a tu tabla comentarios, imaginate el tamaño del resultset que te va a dar, y aparte con datos repetidos ya que por cada comentario vas a tener la misma noticia.

Lo ideal en este caso es que por eso selecciones juego de comentarios aparte de la noticia, es mas optimo para la base de datos, PHP, etc. ya que optimizas la memoria.

El caso en que es automatico por ejemplo es por decir si tienes un comentario y quieres averiguar los datos del usuario que lo hizo (relacion 1:1), en ese caso si tendrias que extender tu ORM para que te pida esos datos de una misma query.

Saludos.
  #5 (permalink)  
Antiguo 28/06/2008, 14:48
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: Ayuda con "ORM" por favor !

Ahh claro tenes razón... si hago eso estoy trayendo 10 mil cosas repetidas ! bueno eso me pasa por postear a las 5 AM estando totalmente dormido... no se a donde tenia la cabeza.

Como vos decis tengo un problema de relaciones... tengo que tomar a los comentarios y a las noticias como cosas diferentes...

Bueno ya tengo como para seguir adelante con este asunto... al menos hasta que choque contra la próxima piedra y tenga que volver por un salva vidas :P

Al margen... lo que se me esta ocurriendo desde ayer es hacer que los objetos puedan funcionar como "padre" o "hijo"... osea, que tengan una propiedad que se llame "parentKey" y otra "parentId". Por ejemplo:

Objeto: "comentario"
Parent:key: "id_noticia"
Parent_val: "12"

Y luego tendría un metodo que busque todos los registros de en la tabla "comentario" con "id_noticia = 12"... algo así...

Ahora voy a ver qué sale...


Bueno, nuevamente gracias por tu ayuda che, despues vengo a contar si salio bien, un abrazo !
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 22:37.