Objection.js: snakeCaseMappers works differently for objects and FieldExpressions

Created on 24 Sep 2018  路  4Comments  路  Source: Vincit/objection.js

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.

bug

All 4 comments

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:

  • copying the snakeCase from lib/utils/identifierMapping.js
  • creating a new snakeCaseMappers() factory that:

    • uses objection.snakeCaseMappers().parse() for parsing

    • uses the copied snakeCase for formatting, but only until the first :. Like mapLastPart, but _until_ instead of _from_ the separator

I 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.)

Was this page helpful?
0 / 5 - 0 ratings

Related issues

bsdo64 picture bsdo64  路  3Comments

nazar picture nazar  路  3Comments

louis-etne picture louis-etne  路  4Comments

zacharynevin picture zacharynevin  路  4Comments

rickmed picture rickmed  路  4Comments