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

PHP OO BD Relacional y objetos

Estas en el tema de BD Relacional y objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, estoy empezando a usar objetos en PHP, me encuentro con el siguiente problema. Al realizar la BD relacional, suelo hacer muchas tablas y relaciones ...
  #1 (permalink)  
Antiguo 16/03/2011, 13:01
 
Fecha de Ingreso: octubre-2009
Mensajes: 223
Antigüedad: 12 años
Puntos: 2
BD Relacional y objetos

Buenas, estoy empezando a usar objetos en PHP, me encuentro con el siguiente problema.

Al realizar la BD relacional, suelo hacer muchas tablas y relaciones entre ellas, esto es porque es más legible, en mi opinión. Antes cuando no usaba objetos/clases al extraer los datos de la BD lo hacía mediante INNER JOIN.

En este caso no se como se suele hacer. ¿Que me recomendais?

Por si ayuda, para la base de datos habia pensado en ActiveTable y ActiveRecord, porque quiero tener el menor código para transferencias con la BD

Gracias anticipadas!!
  #2 (permalink)  
Antiguo 16/03/2011, 13:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 15 años, 5 meses
Puntos: 2135
Respuesta: BD Relacional y objetos

No hay ningún problema en combinar los dos, de hecho es recomendado ya que son herramientas, el patrón ActiveTable y ActiveRecord sirven para trabajar con una tabla en concreto, si necesitas hacer consultas que te traigan datos de varias tablas, puedes hacer un join sin problema y devolver un array de objetos con todos los datos.

Saludos.
  #3 (permalink)  
Antiguo 16/03/2011, 13:26
 
Fecha de Ingreso: octubre-2009
Mensajes: 223
Antigüedad: 12 años
Puntos: 2
Busqueda Respuesta: BD Relacional y objetos

Vale perfecto.

Te pongo un ejemplo así rápido y me comentas como lo ves. Porque no lo tengo claro del todo, una cosa es el objeto que crearé con la clase y otra la disposición de la BD.

En BD

TABLA CATEGORIA
----------------------
Id_categoria
Nombre

TABLA NOTICIA
--------------------
Id_noticia
Id_categoria (Relacionada con la tabla Categoria)
Contenido
Fecha...

En PHP
Código PHP:
Ver original
  1. class Noticia
  2. {
  3. var $id_noticia;
  4. var $contenido;
  5. var $fecha;
  6. ....
  7. var $categoria;  // La inicializaría segun el Id_categoria de la tabla,
  8. // No pongo id_categoría porque entonces al extraer un objeto no tendría el nombre sino el id, por lo que tendría que hacer otra consulta para extraer el nombre de la categoria a partir de la id
  9.  
  10. function __construct($id,$id_cat,$contenido,$fecha....)
  11. {
  12. $this->id_noticia=$id;
  13. $this->categoria=damecategoria($id_cat);
  14. $this->contenido=$contenido;
  15. $this->fecha=$fecha;
  16. }
  17.  
  18. function setCategoria($cat)
  19. {
  20.     $this->categoria=dameId_categoria($cat);
  21. }
  22.  
  23. }
  #4 (permalink)  
Antiguo 16/03/2011, 15:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 15 años, 5 meses
Puntos: 2135
Respuesta: BD Relacional y objetos

Pues te digo depende mucho ya de tu sistema, lo ideal es que tuvieras un ORM que manejara esas cosas por ti, que fuera algo así:
Código PHP:
Ver original
  1. class Noticia
  2. {
  3.     private $_idNoticia;
  4.     private $_Categoria;
  5.    
  6.     public function __construct($nIdNoticia = 0, Categoria $Categoria = null)
  7.     {
  8.         $this->_idNoticia = $nIdNoticia;
  9.         $this->_Categoria = $Categoria;
  10.     }
  11.    
  12.     public function setCategoria(Categoria $Categoria)
  13.     {
  14.         $this->_Categoria = $Categoria;
  15.        
  16.         return $this;
  17.     }
  18.    
  19.     public function getCategoria()
  20.     {
  21.         return $this->_Categoria;
  22.     }
  23.    
  24.     public function setIdNoticia($nIdNoticia)
  25.     {
  26.         $this->_idNoticia = $nIdNoticia;
  27.        
  28.         return $this;
  29.     }
  30.    
  31.     public function getIdNoticia($nIdNoticia)
  32.     {
  33.         return $this->_idNoticia;
  34.     }
  35. }
  36.  
  37. class Categoria
  38. {
  39.     private $_idCategoria;
  40.     private $_categoria;
  41.    
  42.     public function __construct($nIdCategoria = 0, $sCategoria) {
  43.         $this->_idCategoria = $nIdCategoria;
  44.         $this->_categoria = $sCategoria;
  45.     }
  46.    
  47.     public function setCategoria($sCategoria)
  48.     {
  49.         $this->_categoria = $sCategoria;
  50.        
  51.         return $this;
  52.     }
  53.    
  54.     public function getCategoria()
  55.     {
  56.         return $this->_categoria;
  57.     }
  58.    
  59.     public function setIdCategoria($nIdCategoria)
  60.     {
  61.         $this->_idCategoria = $nIdCategoria;
  62.        
  63.         return $this;
  64.     }
  65.    
  66.     public function getIdCategoria()
  67.     {
  68.         return $this->_idCategoria;
  69.     }
  70.    
  71.     public function __toString()
  72.     {
  73.         return $this->getCategoria();
  74.     }
  75. }

Lo ideal es que tu capa de persistencia a la hora de hacer una consulta te traiga tu objeto listo, es decir internamente hace un JOIN con la tabla y trae la categoría relacionada y la inyecta a tu objeto, y ya en tu objeto solo haces un getCategoria() para obtener la categoría, así lo mantienes independiente y no metes código de proceso/persistencia en tus objetos.

Un ejemplo es algo así:
Código PHP:
Ver original
  1. public function getNoticiaById($nIdNoticia)
  2. {
  3.     $DB = $this->getDb();
  4.     $sQuery = "SELECT * FROM noticias AS n INNER JOIN categorias AS c ON n.id_categoria = c.id_categoria WHERE n.id_noticia=:id_noticia";
  5.     $Stmt = $DB->prepare($sQuery);
  6.     $Stmt->execute(array(':id_noticia' => $nIdNoticia));
  7.    
  8.     $aData = $Stmt->fetch(PDO::FETCH_ASSOC);
  9.     $Noticia = new Noticia();
  10.     $Noticia->setIdNoticia($aData['id_noticia'])
  11.             ->setCategoria(new Categoria($aData['id_categoria'], $aData['categoria']));
  12.            
  13.     return $Noticia;
  14. }

Claro todo eso lo puedes automatizar aún más y de eso se encarga un ORM de mapear tus objetos simples, y persistirlos de una manera automatizada usando un mapeo objeto relacional.

Espero con este ejemplo tengas una idea más clara de como hacerlo.

Saludos.
  #5 (permalink)  
Antiguo 17/03/2011, 03:38
 
Fecha de Ingreso: octubre-2009
Mensajes: 223
Antigüedad: 12 años
Puntos: 2
Respuesta: BD Relacional y objetos

Ya entiendo.

En la clase Noticia una de las variables es de tipo Categoria y con eso ya tienes toda la información que quieras de la categoria, como puede ser el nombre o la id.

Una duda, lo de crear las variables con un guion bajo delante, es por algo o simplemente por nomenclatura que usas?

Gracias de nuevo
  #6 (permalink)  
Antiguo 17/03/2011, 03:54
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 13 años, 9 meses
Puntos: 845
Respuesta: BD Relacional y objetos

Cita:
Iniciado por gspablo Ver Mensaje
...
Una duda, lo de crear las variables con un guion bajo delante, es por algo o simplemente por nomenclatura que usas?
Es por standard, tanto las propiedades como los metodos con visibilidad private o protected deberian empezar con underscore.

http://framework.zend.com/manual/en/...nventions.html

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 17/03/2011, 04:24
 
Fecha de Ingreso: octubre-2009
Mensajes: 223
Antigüedad: 12 años
Puntos: 2
Respuesta: BD Relacional y objetos

Perfecto.

He apuntado lo más interesante de ese standart, como estoy aprendiendo asi ya aprendo cumpliendo el standart

Etiquetas: bd, objetos
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 12:15.