Tengo una tabla llamada Cat
, y una clase PHP llamada Cat
. Ahora quiero hacer una clase CatDataMapper
, de modo que Cat extends CatDataMapper
.¿Cómo se ve un Data Mapper?
Quiero que la clase Data Mapper proporcione la funcionalidad básica para hacer ORM, y para crear, editar y eliminar Cat.
Para ese propósito, ¿tal vez alguien que conozca este patrón muy bien podría darme algún consejo útil? Siento que sería un poco demasiado simple solo proporcionar algunas funciones como update(), delete(), save().
Me doy cuenta de que un Data Mapper tiene este problema: Primero crea la instancia de Cat, luego inicializa todas las variables como name, furColor, eyeColor, purrSound, meowSound, asistentes, etc. y después de que todo esté configurado, usted llama a la función save() heredada de CatDataMapper. Esto fue simple;) Pero ahora, el problema real: consulta la base de datos de gatos y obtiene un conjunto de resultados aburridos con muchos datos de gatos.
PDO cuenta con algunas capacidades ORM para crear instancias Cat. Digamos que lo uso, o incluso digo que tengo una función mapDataset() que toma una matriz asociativa. Sin embargo, tan pronto como obtuve mi objeto Cat de un conjunto de datos, tengo datos redundantes. Al mismo tiempo, veinte usuarios podían recoger los mismos datos de gato de la base de datos y editar el objeto cat, es decir, cambiar el nombre del gato y guardarlo(), mientras que otro usuario todavía tiene que ver con establecer otro furColor. Cuando todos ellos guardan sus ediciones, todo está en mal estado.
Err ... ok, para mantener esta pregunta realmente corta: ¿Qué es una buena práctica aquí?
Tengo una pregunta con respecto a Data mapper vs Table Data gateway (TDG). Las tablas de patrones TDG mapean 1: 1 con una tabla, pero a menudo en algunos métodos de clase TDG, necesitamos unirnos a la tabla principal con otras tablas (para unirnos a algunas tablas padre para seleccionar información adicional). ¿Eso viola el patrón de puerta de enlace de datos de tabla? En mi humilde opinión, tan pronto como agregue otras tablas de DB (incluso combinaciones) en sentencias de SQL en métodos de clase TDG, o divida su modelo (modelo de dominio o datos de tabla) en dos clases - la clase se convierte en una clase de mapeador de datos. IMHO Data Mapper es solo una evolución normal de sus clases de TDG. – Centurion
Además, si su clase de fuente de datos implementada es capaz de conectarse a varias fuentes (DB o algún servicio web), en mi humilde opinión, ha implementado la clase de mapeador de datos. – Centurion
Fowler afirma en POEAA que un TDG puede contener el código para acceder a muchas tablas/vistas, así que supongo que también puede hacer uniones en él. Pero, por supuesto, eso significa que los resultados devueltos ya no coincidirán con 1: 1 en las tablas y que necesitará actualizaciones especializadas e Insertar consultas para esas filas, además de las genéricas. Puedo ver cómo eso te hace concluir que se parece a Data Mapper, pero el propósito de Data Mapper es mucho más complejo que eso. No es solo JOIN => DataMapper. Eche un vistazo a http://css.dzone.com/books/practical-php-patterns/practical-php-patterns-data – Gordon