Repository navigation
La lista de campos de un modelo se recarga cuando se actualiza su tabla - #2065
Open
daniel89fg wants to merge 1 commit into
Open
daniel89fg wants to merge 1 commit into
daniel89fg wants to merge 1 commit into
Conversation
Si la tabla se comprobaba en una transacción, DbUpdater la omitía y el modelo cargaba y guardaba en caché los campos sin las columnas nuevas. Al actualizar después la tabla, clearCache() no borraba model-fields-* ni static::$fields, y los INSERT y UPDATE omitían esas columnas. Ahora el constructor descarta la lista de campos al comprobar la tabla y loadModelFields() no la guarda en caché mientras la tabla no esté comprobada. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Descripción
Un modelo podía quedarse con una lista de campos obsoleta cuando su tabla se actualizaba después de haber cargado los campos. Los
INSERTyUPDATEdel modelo omitían entonces las columnas nuevas, sin ningún error.Se vio con el plugin ConciliacionBancaria, que añade la columna
idbankmovementa tablas del core (asientos,recibospagoscli,recibospagosprov). La primera vez que se usaban esos modelos era dentro de una transacción:DbUpdater::createOrUpdateTable()omite la comprobación de la tabla si hay una transacción abierta («se comprobará después») y no la marca como revisada.ModelClassllama aloadModelFields(), que lee las columnas de la base de datos (todavía sin las nuevas) y las guarda enstatic::$fieldsy en la caché (model-fields-<Modelo>).ALTER TABLE).clearCache()borramodel-<Modelo>-*,join-model-*ytable-<tabla>-*, pero nomodel-fields-<Modelo>, ystatic::$fieldssigue en memoria.En PostgreSQL la consulta fallaba por columna inexistente; en MySQL la columna se creaba, pero el modelo seguía guardando sin ella.
Solución
loadModelFields(), para leerla de nuevo con la estructura actualizada.loadModelFields()solo guarda la lista de campos en caché si la tabla ya está comprobada. Si la comprobación se omitió por estar en transacción, la lista se queda solo en memoria y se descarta cuando la tabla se compruebe.Cuando la tabla ya está comprobada (el caso normal) no cambia nada: ni se descarta la caché ni se hacen consultas de más.
Cambios realizados
Core/Template/ModelTrait.php: nuevo método protegidoclearModelFields()yloadModelFields()no guarda en caché si la tabla no está comprobada.Core/Template/ModelClass.php: declaración abstracta declearModelFields()y su uso en el constructor tras comprobar la tabla.Test/Core/Template/ModelFieldsTest.phpyTest/Core/Template/TestModelFields.php: un modelo de prueba cuya tabla gana la columnaemail2después de cargar los campos.INSERT.Los dos tests fallan sin la corrección.
Cómo probar
vendor/bin/phpunit --filter ModelFieldsTest.🤖 Generated with Claude Code