Node.js datatables editor - Custom/Unique validation for multiple columns
Node.js datatables editor - Custom/Unique validation for multiple columns
The Validator.dbUnique() let's me validate a value prior to insert if the value is unique in that column. Ref. https://editor.datatables.net/manual/nodejs/validation
new Field( 'groups.name' )
new Field( 'groups.product_id' ),
.validator( Validator.dbUnique() )
new Field( 'groups.type' )
new Field( 'groups.status' );
What I need though is a validation for multiple columns. So insert the new record only if the product_id IS NOT of type=1 and status=2 found.
Here is a php example combining multiple columns https://datatables.net/forums/discussion/57729/unique-validation-for-multiple-columns
->validator( function($editor, $action, $data){
if ($action === Editor::ACTION_CREATE || $action === Editor::ACTION_EDIT){
foreach ($data['data'] as $pkey => $values ){
$count = $editor->db()->query('select')->get('*')->table('teachers_subjects')
->where('teachers_subjects.teacher', $values['teachers_subjects']['teacher'])
->where('teachers_subjects.subject', $values['teachers_subjects']['subject'])
->exec()
->count();
if ($count == 1){
return 'This selection is already in the database.';
}
}
}
})
But how to do so with node.js ?
Rf. https://editor.datatables.net/manual/nodejs/validation#Global-validators
This question has an accepted answers - jump to answer

Answers
The Editor NodeJS libraries use KnexJS for the database interaction and the KnexJS documentation is available on its site.
I have to warn you - I haven't tried running the above code - I've just translated the PHP into modern node (so you might need to polyfill Object.entries depending on what version you are using) and I might have made a daft mistake somewhere - apologies if so (check the
countvariable - it might be an array...), but hopefully that will get you started with it.Allan
Thanks Allan! That's how I got it to work:
Object.entries() not being supported by IE as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Polyfill might be an issue if user use IE I suppose. How would the example look like with the suggested polyfill ?
Keep in mind that the validator is run on the server-side in NodeJS, so that code is never going to be run by IE (thankfully! The use of a fat arrow function, async,
letand desctructuring would all cause it problems!).Allan
Missed this question. The polyfill adds the missing function, so it would look exactly the same.
Allan
Oh ... I totally didn't think of that. Then it's all good.
Also a minor change to my solutions ... it returns an array so I needed to check on:
Many thanks!