--- name: CodeIgniter $allowedFields Pitfall description: Quando adicionar coluna nova no banco, OBRIGATORIO adicionar em $allowedFields do Model. CI4 filtra silenciosamente. type: feedback originSessionId: 86576285-fa7a-44f0-8ed3-9a88bcd27a8e --- # CodeIgniter Model::$allowedFields — Filtro Silencioso Quando voce adiciona uma coluna nova numa tabela existente E vai usar pelo Model, **SEMPRE** adicionar em `$allowedFields`. CI4 com `$protectFields = true` (padrao) **filtra silenciosamente** campos fora dessa lista — sem warning, sem erro, sem nada nos logs. **Why**: 2026-05-05, novo cadastro de usuario direcao nao salvava o `is_superuser` mesmo com tudo certo no controller. Horas perdidas debugando JS, filtros, rotas, browser cache. O bug era: `is_superuser` (coluna existente no banco) nao estava em `UsuarioModel::$allowedFields`. CI removia o campo do INSERT antes de mandar pro DB. INSERT executava com sucesso (sem `is_superuser`), mas o usuario criado nao virava super. **How to apply**: 1. Toda migration que adiciona coluna usada por Model → ja editar o Model junto pra adicionar em `$allowedFields` 2. Quando bug de "campo X nao salva mas insert nao da erro", PRIMEIRO checar `$allowedFields` 3. Mesma armadilha ja apareceu em: `MatriculaModel` (campos `data_trancamento`, `motivo_trancamento`, etc), `AulaModel` (campos `presenca_aluno`) 4. Quando usar `$db->table()->update()` direto, NAO passa por `$allowedFields` — workaround quando precisa atualizar campo nao listado