Foros del Web » Programando para Internet » PHP »

PHP OO Obtener propiedades de la base de datos

Estas en el tema de Obtener propiedades de la base de datos en el foro de PHP en Foros del Web. Hola buenas, Tengo poca práctica con la programación Orientada a objetos y las base de datos al mismo tiempo, y tengo un pequeño "cacao" mental. ...
  #1 (permalink)  
Antiguo 01/10/2010, 14:03
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Obtener propiedades de la base de datos

Hola buenas,

Tengo poca práctica con la programación Orientada a objetos y las base de datos al mismo tiempo, y tengo un pequeño "cacao" mental.

Tengo la siguiente duda:

Si tengo un objeto del tipo:

coche{
id
color
peso
modelo
}

Y quiero extraer de la base de datos estas propiedades, pasándole la id por ejemplo, puedo hacer getCoche($id), pero.. como lo haría para extraer solamente los atributos que me interesen? por ejemplo, extraer sólo el color y el peso?

Un saludo y gracias!
  #2 (permalink)  
Antiguo 02/10/2010, 11:32
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Obtener propiedades de la base de datos

Hola miktrv, hay un par de cosas que ver aquí:

1. El "Objeto" que creas se crea desde una classe, esta classe tiene X métodos que definens su comportamiento. Ahora bien, tu tienes un método getCoche($id) que hace exactamente lo que tú quieras. No tiene en realidad ninguna relación con la tabla de la DB hasta que tú definas esta relación.
Con esto quiero decir que el método devuelve lo que tú lo digas. El hecho que tengas una tabla coches y una classe Coche es simplemente un tema conceptual, los datos de la classe coche se guardan en esa tabla, pero podrían estar en cualquier sitio.
2. Siguiendo con lo anterior, el metodo getCoche($id) devuelve lo que tú quieras, por ejemplo un array con todos los datos de ese coche de la tabla o bien un solo dato. Por ejemplo:

Código PHP:
private function getCoche($id){
            
$sql "select * from coches where coche = '$id'";
            
$query mysql_query($sql);
            while (
$fetch mysql_fetch_assoc($query)){
                
$return['id'] = $fetch['id'];
                
$return['marca'] = $fetch['marca'];
                
$return['color'] = $fetch['color'];
            }
            
            return 
$return;
        } 
Este método sólo devuelve 3 propiedades de la db.

Esta otra devuelve todas en forma de puntero:

Código PHP:
private function getCoche($id){
            
$sql "select * from coches where coche = '$id'";
            
$query mysql_query($sql);
            return 
$fetch mysql_fetch_assoc($query);
        } 
Resumiendo, cuidado con confundir la estructura de datos con el modelo de datos.
La base de datos es estructura de datos, las classes son entidades conceptuales, el vínculo entre una cosa y la otra lo programas tú.
No se si te he aclarado algo o no, espero que sirva, un saludo
  #3 (permalink)  
Antiguo 02/10/2010, 12:20
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Hola buenas de nuevo,

Creo que no me he explicado bien,

Haber, supongamos que mi objeto tiene las siguientes propiedades:

id, color, peso, marca

Y mi base de datos

id, color, peso, marca (los mismos)

Ahora bien, imaginemos que en una sección sólo me interesa mostrar el color, y en otra sección el color, la marca y el peso. No me gustaría tener que hacer un SELECT *, cuando en realidad sólo quiero traerme el color de la base de datos...

Un saludo y gracias por tu tiempo!

Última edición por miktrv; 02/10/2010 a las 12:39
  #4 (permalink)  
Antiguo 03/10/2010, 00:58
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Obtener propiedades de la base de datos

Ok, entonces haz de declarar un método por cada variable, cada método buscará y dará valor a una propiedad diferente:

Código PHP:
private function getCocheMarca($id){
            
$sql "select marca from coches where coche = '$id'";
            
$query mysql_query($sql);
            while (
$fetch mysql_fetch_assoc($query)){
                
$return['marca'] = $fetch['marca'];
            }
            
            return 
$return;
        } 
private function 
getCocheColor($id){
            
$sql "select color from coches where coche = '$id'";
            
$query mysql_query($sql);
            while (
$fetch mysql_fetch_assoc($query)){
                
$return['color'] = $fetch['color'];
            }
            
            return 
$return;
        } 
claro que esto te obliga a escribir un método por cada propiedad del objeto con su consiguiente mantenimiento. Lo normal sería un sólo método que le de valor a todas la propiedades.
Tendrías que analizar un poco por qué lo quieres así y si vale la pena. Si haces un método getCoche lo puedes invocar una vez y dar valor a todas las propiedades una sola vez. De la otra manera heces una select para cada propiedad. Según la base de datos, estructura, conexión, etc, etc, esto te puede complicar la cosas. Si intentas ahorrar o controlar los recursos de la db de esta manera no lográs nada porque aunque las selects son pequeñas tienes que conectarte cada vez, etc, etc,...
Claro que a partir de aquí ya decides tú en función a tu sistema.
Espero que sirva de algo, un saludo
  #5 (permalink)  
Antiguo 03/10/2010, 11:32
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Cita:
Iniciado por repara2 Ver Mensaje
Ok, entonces haz de declarar un método por cada variable, cada método buscará y dará valor a una propiedad diferente:

Código PHP:
private function getCocheMarca($id){
            
$sql "select marca from coches where coche = '$id'";
            
$query mysql_query($sql);
            while (
$fetch mysql_fetch_assoc($query)){
                
$return['marca'] = $fetch['marca'];
            }
            
            return 
$return;
        } 
private function 
getCocheColor($id){
            
$sql "select color from coches where coche = '$id'";
            
$query mysql_query($sql);
            while (
$fetch mysql_fetch_assoc($query)){
                
$return['color'] = $fetch['color'];
            }
            
            return 
$return;
        } 
claro que esto te obliga a escribir un método por cada propiedad del objeto con su consiguiente mantenimiento. Lo normal sería un sólo método que le de valor a todas la propiedades.
Tendrías que analizar un poco por qué lo quieres así y si vale la pena. Si haces un método getCoche lo puedes invocar una vez y dar valor a todas las propiedades una sola vez. De la otra manera heces una select para cada propiedad. Según la base de datos, estructura, conexión, etc, etc, esto te puede complicar la cosas. Si intentas ahorrar o controlar los recursos de la db de esta manera no lográs nada porque aunque las selects son pequeñas tienes que conectarte cada vez, etc, etc,...
Claro que a partir de aquí ya decides tú en función a tu sistema.
Espero que sirva de algo, un saludo
Hola buenas,


Muchas gracias por tu respuesta,

Todo depende de cada caso, pero hacer una consulta a la base de datos que tenga por ejemplo SELECT * para un campo que no se va a usar y que puede ser muy grande, tampoco es correcto, yo tampoco me decanto por usar consultas independientes. Más bien, creo que optaré por hacer lo siguiente después de ver algunas opciones:

Crear un método por cada propiedad:


getCocheColor, getCocheMarca, etc

Y que cada uno de estos métodos, creen una consulta SQL, siendo el último objeto llamado getDataCoche, quien se encargue de hacer la consulta y asignar los valores a cada propiedad a través de su respectivo método.

No se si en la práctica será buena idea... lo intentaré..

Un saludo!
  #6 (permalink)  
Antiguo 04/10/2010, 13:19
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 7 meses
Puntos: 91
Respuesta: Obtener propiedades de la base de datos

Aunque también puedes crear un método como el siguiente:

Código PHP:
function getCoche($id$campos="*"){

$sql "SELECT {$campos} FROM coche WHERE id={$id}";
$query mysql_query($sql);

.
.
.
.


Entonces ahi le mandas por parámetro los campos que quieras traer. y si no le envias el parametro entonces se traerán todos los campos por el parámetro opcional.

por ejemplo si llamas a la función

getCoche(1,"color,peso");

traerás el color y peso del coche 1

y si pones

getCoche(1);

traes todos los datos del coche 1.


saludos
  #7 (permalink)  
Antiguo 04/10/2010, 15:37
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Cita:
Iniciado por Ribon Ver Mensaje
Aunque también puedes crear un método como el siguiente:

Código PHP:
function getCoche($id$campos="*"){

$sql "SELECT {$campos} FROM coche WHERE id={$id}";
$query mysql_query($sql);

.
.
.
.


Entonces ahi le mandas por parámetro los campos que quieras traer. y si no le envias el parametro entonces se traerán todos los campos por el parámetro opcional.

por ejemplo si llamas a la función

getCoche(1,"color,peso");

traerás el color y peso del coche 1

y si pones

getCoche(1);

traes todos los datos del coche 1.


saludos
Sí, pero, al final sería lo mismo, es decir, tendré que asignar los métodos uno por uno dependiendo de los campos que se le pasen por parámetro.. lo de la id no lo entiendo muy bien... ya que puede que quiera todos los coches, y de estos coches el peso y color,

Muchas gracias por tu ayuda!!
  #8 (permalink)  
Antiguo 04/10/2010, 16:45
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: Obtener propiedades de la base de datos

Un buen trabajo para un DataMapper



http://martinfowler.com/eaaCatalog/dataMapper.html

Hay que pensar un poco más en objetos, si quisieras varios coches entonces necesitarías una colección de objetos coches que cada uno a la vez pueda darte los datos de cada coche.

Separación de responsabilidades.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #9 (permalink)  
Antiguo 05/10/2010, 02:29
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Hola buenas,

Muchas gracias por la respuesta,

Al final la cosa la estoy tratando así:


objeto coche
objeto workdb, que sería lo que comentabas de data manager.

Y los métodos de coche usan mi clase workdb para trabajar con la base de datos.

La duda era mas bien estaba en cual era la mejor manera de extraer sólo los datos necesarios de la base de datos sin tener que hacer un SELECT * y setear todos los atributos por obligación...

Un saludo!
  #10 (permalink)  
Antiguo 05/10/2010, 07:12
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Obtener propiedades de la base de datos

Puedes utilizar también el Patrón Active Record o ORM.

Existen muchas implementaciones en php.

La otra opcion es utilizar en vez de mysql_fetch_assoc mysql_fetch_object

Esta función te devuelve el resourse de la base de datos como un objeto stdClass en caso de que no le especifiques. En el segundo parámetro puedes especificar un string con el nombre de la clase en concreto que desees.

Saludos.

Última edición por atrianaster; 05/10/2010 a las 07:22
  #11 (permalink)  
Antiguo 05/10/2010, 07:31
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Cita:
Iniciado por atrianaster Ver Mensaje
Puedes utilizar también el Patrón Active Record o ORM.

Existen muchas implementaciones en php.

La otra opcion es utilizar en vez de mysql_fetch_assoc mysql_fetch_object

Esta función te devuelve el resourse de la base de datos como un objeto stdClass en caso de que no le especifiques. En el segundo parámetro puedes especificar un string con el nombre de la clase en concreto que desees.

Saludos.
Hola,

Muchas gracias por tu ayuda. Podrías orientarme un poco más sobre está opción? (ORM)

Un saludo!
  #12 (permalink)  
Antiguo 05/10/2010, 07:48
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Obtener propiedades de la base de datos

Por ejemplo aqui tienes una implementacion, con ejemplos.

http://www.phpclasses.org/package/62...e-records.html

Saludos.
  #13 (permalink)  
Antiguo 05/10/2010, 10:32
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Obtener propiedades de la base de datos

Cita:
Iniciado por atrianaster Ver Mensaje
Por ejemplo aqui tienes una implementacion, con ejemplos.

http://www.phpclasses.org/package/62...e-records.html

Saludos.
Muchas gracias por tu ayuda, me he descargado una para probar, haber que me sale.. un saludo!

Etiquetas: propiedades
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:48.