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

Capa de acceso a datos

Estas en el tema de Capa de acceso a datos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola! Estoy en proceso de desarrollar un proyecto (a modo de hobbie) y así aprender y reforzar mis conocimientos, hasta ahora escasos de POO. Bien ...
  #1 (permalink)  
Antiguo 20/03/2007, 02:59
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 20 años, 7 meses
Puntos: 3
Pregunta Capa de acceso a datos

Hola! Estoy en proceso de desarrollar un proyecto (a modo de hobbie) y así aprender y reforzar mis conocimientos, hasta ahora escasos de POO.

Bien he leído algo sobre MVC y demás, y os comento. Por ejemplo, imaginemos que quiero hacer un foro. Un foro tiene posts y tiene usuarios.

Entonces claramente, ahí tenemos 2 clases, la clase usuario y la clase post.
Como bien sabemos, un post es de un usuario.

Mi pregunta es, si por ejemplo vamos a hacer un listado de todos los post mostrando a cada post cual es el usuario que lo ha creado, en SQL es tan fácil como decir select [tal tal tal] from usuarios, post where usuario.id = posts.usuario_id. Pero claro, haciendo esto las clases nos las pasamos por el forro, y teniendo un gestor de base de datos, veo algo "tonto" seleccionar primero los post y luego a cada post coger su usuario (aunque sea sólo el nombre).

¿Aguien sabe como plantear esto?
  #2 (permalink)  
Antiguo 20/03/2007, 14:34
Avatar de El Menda  
Fecha de Ingreso: junio-2001
Ubicación: Jaén
Mensajes: 516
Antigüedad: 22 años, 10 meses
Puntos: 0
Re: Capa de acceso a datos

Yo también he estado estos días leyendo sobre clases, MVC y demás, y creo que mi caso es parecido al tuyo, pero el problema es que no entiendo bien a partir de donde dices: "Mi pregunta es..."


Puede que mi problema sea el mismo que el tuyo, pero en este caso es para mostrar en una página unas noticias.
Si tengo un listado de titulares de noticias que mostrar en noticias.php, ¿de qué me serviría usar una clase que se llame noticia y se llame de la manera $noticia->mostrar_titular($id) si en la pagina noticias.php tengo que llamar a la base de datos para sacar todos los id de las últimas 10 noticias y volver a llamar inutilmente a la clase para mostrar el titular de cada una cuando desde el momento que he consultado la bd he podido sacar el titular? ¿Cómo enfocamos el problema sin desperdiciar recursos?
__________________
"No hay mujer fea sino copa de menos"
  #3 (permalink)  
Antiguo 21/03/2007, 06:01
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 20 años, 7 meses
Puntos: 3
Información Re: Capa de acceso a datos

Veamos, mi consulta va por otros tiros. Imaginemos los post de un foro y los usuarios. Evidentemente son tablas diferentes, lo único que en los post se guarda el id del usuario que lo creo.

Entonces tenemos que las tablas son así (por ejemplo):

Posts: id (int), user_id(int), texto(text)
Usuarios: id(int), nombre(varchar(50))

Y en clases lo representaríamos así:

Código PHP:
class post {
 
// atributos
 
var $id;
 var 
$user_id;
 var 
$texto;
 
// métodos
 /* los metodos que sean */
}
class 
user{
 
// atributos
 
var $id;
 var 
$nombre;
 
// métodos
 /* los metodos que sean */

Para luego manejar estas clases para por ejemplo hacer un listado, tendríamos que tener unas clases globales que manejaran a estas. Es decir

Código PHP:
class managerPost {
 
// atributos
 
var $aPosts/* array de posts */
 // metodos
 
function listarPost() { /* codigo */ }

Para los usuarios ser haría lo mismo.

Bien entonces teniendo el ejemplo de los post, es lógico que la función listar fuera así:
Código PHP:
function listarPost($oBaseDeDatos) { 
 
$sql "select * from posts;"
 
$resultado $oBaseDeDatos->query($sql);
 
/* hacemos lo que sea con el resultado */

Bien, con esto tengo una función que me lista todos los post. Guay, pero..y si yo quiero que en el listado aparezca el nombre del usuario que lo hizo?

En SQL es bien sencillo, se puede hacer un join de las tablas de usuarios y post y solucionado. Pero haciendo esto con SQL, el tema de los objetos me lo paso por el arco del triunfo y claro, teniendo un gestor de base de datos por debajo (MySQL o lo que sea), veo una tontería tener que recuperar el post y luego hacer otra llamada SQL sólo para recuperar el nombre del usuario. De ahí la necesidad de la capa de enlace de datos que interactuara sin violar el tema de los objetos.

Por más que he buscado no he encontrado nada que me dé solución, por lo que creo que la solución pasaría por dar un atributo más a la clase post, que sea por ejemplo $nombreUsuario, y que sólo cuando haga un listado, coga valor.

¿Qué os parece esta solución?

Última edición por kaS_aPPeaL; 21/03/2007 a las 06:05 Razón: Posteé antes de terminar (:S)
  #4 (permalink)  
Antiguo 21/03/2007, 08:59
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
Re: Capa de acceso a datos

El problema que ambos tienen es solo de logica, su capa a datos debe de encargarse de extraer los datos de ambas tablas, por eso son las relaciones m:n, si buscan en motores de bases de datos como Propel, en tu definicion le tienes que decir a tu clase que tal columna es un FK a otra tabla, entonces el motor de tu base de datos debe de ser los suficientemente inteligente de expandir esas llaves y traerte los datos de la otra tabla en automatico.
  #5 (permalink)  
Antiguo 21/03/2007, 09:16
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
Re: Capa de acceso a datos

Pueden darle una leida:

http://propel.phpdb.org/trac/wiki/Us.../Relationships

Pueden ver el codigo y darse una idea de como manejar las relaciones entre las clases.

Saludos.
  #6 (permalink)  
Antiguo 21/03/2007, 16:37
Avatar de El Menda  
Fecha de Ingreso: junio-2001
Ubicación: Jaén
Mensajes: 516
Antigüedad: 22 años, 10 meses
Puntos: 0
Re: Capa de acceso a datos

Tío pues yo hubiera hecho un join y ya está que es lo más eficiente.

No sé si es lo más correcto, pero creo que para pequeños casos está justificado el método.
__________________
"No hay mujer fea sino copa de menos"

Última edición por El Menda; 21/03/2007 a las 16:38 Razón: He escrito mal una cosa xD
  #7 (permalink)  
Antiguo 22/03/2007, 04:41
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 20 años, 7 meses
Puntos: 3
Re: Capa de acceso a datos

Y eso que me dices GatorV, se puede hacer con MySQL??
  #8 (permalink)  
Antiguo 22/03/2007, 04:42
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 20 años, 7 meses
Puntos: 3
Re: Capa de acceso a datos

Cita:
Iniciado por El Menda Ver Mensaje
Tío pues yo hubiera hecho un join y ya está que es lo más eficiente.

No sé si es lo más correcto, pero creo que para pequeños casos está justificado el método.
Claro, es el tema, que pas de las clases para eso, simplemente hago el JOIN y lo muestro, pero el tema era poder respetar las clases, a ver si con la ayuda de lo que dice GatorV veo la luz.
  #9 (permalink)  
Antiguo 22/03/2007, 08:58
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
Re: Capa de acceso a datos

Lo que yo te digo es independiente de tu base de datos, el motor de tu capa de datos debe de ser lo suficientemente inteligente para expandir las FK, no importa si tu base de datos es MySQL, Oracle, SQL Server, Access, XML, Txt, etc.

El motor de tu capa de datos es lo mas importante de la aplicacion ya que es la que se encarga de comunicarse directamente con el data source, ya tu capa de datos, ellos no saben en donde se guardan asi que mantienes una independencia total, asi si tu aplicacion en un futuro te dicen que no la quieren en MySQL si no en Oracle, a ti no te impacta tanto ya que solo tienes que cambiar tu motor de acceso a la base de datos.
  #10 (permalink)  
Antiguo 23/03/2007, 09:59
 
Fecha de Ingreso: marzo-2007
Mensajes: 5
Antigüedad: 17 años, 1 mes
Puntos: 0
Mensaje Re: Capa de acceso a datos

Hola a todos, lo que entiendo de esta discusion es que kaS_aPPeaL quiere traer los datos pero respentando que los datos obtenidos de usuarios sean persistidos en la clase usuarios y los datos post en la clase post

lo que se puede hacer es crear una clase intermedia que traiga los datos con un join o con igualacion de datos, es lo mismo, total sabemos la posicion de cada uno de los datos

la clase intermedia seria PostUsers
class PostUsers{
private Post
private Users

public function __construc(Post p,Users u){
$this->Post = p;
$this->Users=u;
}
}
por ejemplo

SELECT p.Id,p.Texto,u.Nombre FROM Usuarios u, Post p WHERE u.Id = p.IdUsuario;

y la funcion de creacion de objetos seria la siguiente

function listarPost($oBaseDeDatos) {
$sql = "SELECT p.Id,p.Texto,u.Nombre FROM Usuarios u, Post p WHERE u.Id = p.IdUsuario"
$resultado = $oBaseDeDatos->query($sql);
foreach($resultado as $res){
$objres[] = new PostUsers($res['Id'],$res['Texto'],$res['Nombre']);
}
retrun $objres;
}

por lo tanto en la clase intermedia tendrias persistido los dos objetos cada uno con sus respectivos datos.

espero que te sirva si eso era lo que buscabas.

saludos
  #11 (permalink)  
Antiguo 23/03/2007, 10:00
 
Fecha de Ingreso: marzo-2007
Mensajes: 5
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Capa de acceso a datos

Perdon en la funcion me equivoque con los parametros asi seria

function listarPost($oBaseDeDatos) {
$sql = "SELECT p.Id,p.Texto,u.Nombre FROM Usuarios u, Post p WHERE u.Id = p.IdUsuario"
$resultado = $oBaseDeDatos->query($sql);
foreach($resultado as $res){
$objres[] = new PostUsers(new Post($res['Id'],$res['Texto']),new Users($res['Nombre']));
}
retrun $objres;
}

Saludos
  #12 (permalink)  
Antiguo 01/04/2007, 14:11
 
Fecha de Ingreso: enero-2003
Mensajes: 10
Antigüedad: 21 años, 3 meses
Puntos: 0
Re: Capa de acceso a datos

Si no he entendido mal, creo que te refieres a cuando quieres imprimir algo desde la base de datos. En teoria una clase no debe imprimir cosas. Pero tu quieres imprimir.

Yo lo hago asi:

en la clase
Código PHP:
    function Mostrar() {
        
$query "SELECT * FROM `tabla` ORDER BY id DESC";
        
$res mysql_query($query) or die("No se pudo sacar informacion de la BD");
        
$muestra = array();
        while(
$row mysql_fetch_array($res))
            
$muestra[] = $row;
        return 
$muestra;
    } 
y luego para mostrar:
Código PHP:
if($objeto->Mostrar())
{
    foreach (
$objeto->Mostrar() as $row) {
        echo 
'<div class="tabla"><b>'.$row["autor"].'</b> el '.date("d/m/Y",$row["fecha"]).' a las '.date("H:i",$row["fecha"]);
        echo 
'<hr />'.$row["texto"].'</div>';
    }

Espero que te sirva
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 04:38.