Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Diseño base de datos y clases en PHP

Estas en el tema de Diseño base de datos y clases en PHP en el foro de PHP en Foros del Web. Buenas, Tengo una base de datos llamada BASE_DATOS_A que contiene las siguientes tablas: SERVICE -- integer id -- string campo_a -- string campo_b SERVICE_EXTENDS -- ...
  #1 (permalink)  
Antiguo 01/06/2015, 15:09
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 8 meses
Puntos: 36
Diseño base de datos y clases en PHP

Buenas,

Tengo una base de datos llamada BASE_DATOS_A que contiene las siguientes tablas:

SERVICE
-- integer id
-- string campo_a
-- string campo_b

SERVICE_EXTENDS
-- integer id
-- integer id_tabla_a
-- string campo_c


La idea es que SERVICE es una tabla federada, se encuentra en otro servidor, y no queremos modificar ninguno de los valores de sus atributos (sólo leerlos). Es una tabla que se comparte en muchas otras aplicaciones. Y tenemos una SERVICE_EXTENDS que en POO (si estuviéramos programando clases en PHP) extendería la clase llamada TABLA_A y le añadiría funcionalidad (sería como una especie de subclase de la tabla SERVICES)

Lo que se quiere hacer es tener una vista (un formulario) con los inputs:
- campo_a (input de solo lectura)
- campo_b (input de sólo lectura)
- campo_c (input de lectura/escritura porque pertenece a la TABLA_B)

El caso es que el MER queda un poco raro luego a la hora de pasarlo a clases en PHP. A mi no me termina de convencer. Había pensado como solución hacer una vista que hiciera el INNER JOIN de las dos tablas, aunque luego creo que no sabría que campos pertenecen a la tabla federada (y por lo tanto en el formulario html deberían ser de sólo lectura) y esa vista sería mi clase en PHP.

También tener sólo una clase SERVICE_EXTENDS y definir algo así (en Laravel):

Código PHP:
class SERVICE_EXTENDS extends Eloquent{

public function 
service()
{
      return 
$this->hasOne('Service');
}

public function 
getCampoAAttribute() { return $this->service()->campo_a; }
public function 
getCampoBAttribute() { return $this->service()->campo_b; }


No sé... Parece todo muy forzado y poco elegante.
  #2 (permalink)  
Antiguo 02/06/2015, 05:08
Avatar de zalito12  
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 12 años, 4 meses
Puntos: 67
Respuesta: Diseño base de datos y clases en PHP

Yo creo que el modelo nunca te va a parecer muy... vistoso puesto que solo tiene un atributo propio, pero si cambiaría algo, por ejemplo la relación más bien es un pertenece a:
http://laravel.com/docs/4.2/eloquent#relationships
Código PHP:
Ver original
  1. class SERVICE_EXTENDS extends Eloquent{
  2.  
  3.     protected $fillable = array('campo_c');
  4.  
  5.     public static $rules = array(
  6.         'campo_c' => 'required' //Si es obligatorio, aquí tus restricciones.
  7.     );
  8.  
  9.     private function service()
  10.     {
  11.         return $this->belongsTo('Service', 'id_tabla_a');
  12.     }
  13.  
  14.     public function campo_a() { return $this->service()->campo_a; }
  15.     public function campo_b() { return $this->service()->campo_b; }
  16.  
  17. }

He puesto la relación como una función privada, no lo he probado nunca pero si está permitido tiene sentido, puesto que tú ya tienes unas funciones que te hacen de interfaz y te devuelven los campos a y b. Además de esta manera no permites acceder al objeto padre, lo que tiene sentido porque tú no quieres que lo escriban.
A ver como te va.
__________________
Dicen que las personas piensan en su lengua materna, yo lo hago en PHP
  #3 (permalink)  
Antiguo 02/06/2015, 12:32
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 8 meses
Puntos: 36
Respuesta: Diseño base de datos y clases en PHP

zalito12 gracias por tu respuesta. Finalmente se ha optado por hacer una vista más en la base de datos que sea el JOIN de esas dos tablas, y será la que usaremos en la aplicación PHP.

Saludos!

Etiquetas: clases, diseño, formulario, html, tabla
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 02:25.