Gestión efectiva de cambios de datos.
Tengo una mesa llamada Reservas. Esta tabla contiene datos que representan una reserva realizada para un servicio en particular, con muchas variables.
Hace un tiempo me encontré con un problema con mi estructura de datos actual por el cual cualquier cambio en la reserva que afectara las horas, fechas o precios afectaría otros registros financieros asociados, listas de reservas para fechas, etc.
Mi solución en ese momento era crear una tabla de Modificaciones que rastreara cualquier cambio realizado en una Reserva. Luego, cada vez que se le solicite al modelo de reserva que devuelva una reserva, agregará las modificaciones realizadas (enafterFind()
Devolución de llamada de Cake) y presente la versión más actualizada de la reserva, algo como esto (disculpe el dibujo de Paint):
Este método funciona bien cuando solicita al modelo de reserva que devuelva la reserva n. ° 1234. Devuelve la representación más actualizada de la reserva, incluidas todas las modificaciones (superpuestas), incluida una matriz que contiene todas las modificaciones.y Los datos de reserva originales para referencia.
Mi problema es que recientemente me di cuenta de que necesito poder consultar este modelo con condiciones personalizadas, y si una de esas condiciones se realizó en una de las modificaciones, el resultado no coincidiría porque el modelo está buscando en el registro original que el registro finalmente presentado. Ejemplo donde consulto el modelo para devolver filas dondeabc
es azul (no gris):
En ese ejemplo, el modelo mira directamente los datos originales para las filas dondeabc
es azul y no devuelve este resultado, porque el valor azul está en una modificación que se adjuntadespués Se encuentran los resultados originales.
Lo que he hecho ahora es poner una consulta en elbeforeFind()
devolución de llamada del modelo de reserva para buscar modificaciones que coincidan con los criterios dados, uniéndose a la reserva para asegurarse de que cualquier otro criterio aún coincida. Cuando devuelve el azul en el ejemplo anterior, almacena ese resultado en una matriz como una propiedad de clase y continúa con el valor regularfind()
, peroexcluye la identificación de esa reserva no se devuelve (porque hemos encontrado una versión más actualizada de la misma). Luego los fusionará, los ordenará nuevamente, etc. en elafterFind()
.
Esto funciona, aunque es un poco más largo de lo que esperaba.
Después de todo eso, me di cuenta de que en otras partes de esta aplicación, hay modelos que se unen manualmente a la tabla de reservas y buscan reservas. Así que ahora necesito una forma de poder incorporar las modificaciones en todas esas uniones manuales directamente a la tabla en MySQL sin afectar los datos originales y preferiblemente sin cambiar demasiado de mi código.
Pensé que necesitaba eliminar la unión manual y crear una asociación modelo en su lugar. Será elbeforeFind()
yafterFind()
¿Todavía se ejecuta el modelo de reserva cuando pregunto, por ejemplo, el modelo de cliente que tiene muchas reservas (para aplicar las modificaciones a cada reserva)?
Mi otra opción era devolver más filas de MySQL de las necesarias eliminando los criterios que pudieran estar contenidos en las modificaciones, luego usar PHP para filtrar los resultados según mis criterios de búsqueda. Esta opción me asustó un poco porque el conjunto de resultados tiene el potencial de ser masivo sin ese criterio ...
¿Cómo puedo lograr esta estructura de datos? Mis requisitos clave siguen siendo que no quiero cambiar el registro de reserva original, sino agregar registros de modificación en la parte superior, pero necesito poder consultar las reservas (incluidas las modificaciones) a través del modelo.
Quiero tratar de mantener la mayor cantidad posible de esta integración detrás de escena para no tener que pasar por toda mi aplicación para cambiarn
Número de consultas que se ven así:
$get_blue = $this->Booking->find('all', array(
'conditions' => array(
'Booking.abc' => 'blue'
)
));
Quiero poder incluir implícitamente cualquier modificación realizada en las reservas para que la reserva actualizada se devuelva en la consulta anterior.
El otro problema es cuando el modelo de reserva se une manualmente a una consulta de búsqueda, así:
$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
'joins' => array(
array(
'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
'alias' => 'Booking',
'type' => 'LEFT',
'conditions' => 'Booking.booking_id = Transaction.booking_id'
)
),
'conditions' => array(
'Booking.abc' => 'blue'
)
));
Como puede ver, la consulta anterior no incluirá la modificación en mi ejemplo MSPaint anterior, porque se une manualmente a la tabla en SQL (la integración de la modificación está en elbefore
yafterFind()
funciones de devolución de llamada del modelo de reserva).
Cualquier ayuda en esto sería muy apreciada.
EditarSé que esto ya es suficiente, pero pensé que agregaría que la razón por la que quiero seguir estos cambios y no actualizar el registro original es que elfinanciero el aspecto no puede cambiar porque afectará la presentación de informes.
La solución más rápida y fácil que puedo ver hasta ahora es aplicar modificaciones directamente a la reserva original en todos los casos, excepto cuando afecta la información financiera, que todavía se rastrea como una modificación (porque actualmente no necesito buscar en función de esta información )