Using snakeCaseMappers, patching an object will not map inner keys, only the first level (columns), but using a FieldExpression will map the json field references.
class TestModel extends Model {
...
static columnNameMappers = snakeCaseMappers();
...
}
// Query with array/object
TestModel
.query()
.patch({
jsonColumn: [{
innerKey: 1
}]
});
// Database output
{
json_column: '[{"innerKey": 1}]'
}
// Query with FieldExpression
TestModel
.query()
.patch({
'jsonColumn:[0][innerKey]': 1
});
// Database output
{
json_column: '[{"inner_key": 1}]'
}
EDIT: IMHO, this should work consistently across, and there could be an option for snakeCaseMappers | knexSnakeCaseMappers, something like deep|deepKeys|innerKeys. Obviously I would prefer it to default to false, and I'm guessing the usual expectation is around how the normal objects now work, but the default's not a big deal for me eitherway.
Objection shouldn't touch the JSON fields at all. It's a bug that the inner keys actually do change in some case.
@koskimas agreed, the option would've been an additional feature based on the "hidden feature" ;)
I fixed this for us by:
snakeCase from lib/utils/identifierMapping.jssnakeCaseMappers() factory that:objection.snakeCaseMappers().parse() for parsingsnakeCase for formatting, but only until the first :. Like mapLastPart, but _until_ instead of _from_ the separatorI needed to revert the fix for this. It caused more problems than it fixed.
any news on this? (thanks for your continued great work, by the way.)