The last two examples illustrate the common case of updating models by ID, but at times updates are needed that involve a WHERE clause or JOINs. Using the DataContext#from, one can build a complex query, and then call the FromAdapter#update method. The FromAdapter#update method takes an object as a paramter: Each key should be a fully-qualified column name (<table-alias>.<column-name>). Here's an example that updates all staff members over the age of 21 that have received at least one bonus.
'use strict'; const MySQLDriver = require('node-data-mapper-mysql').MySQLDriver; const driver = new MySQLDriver(require('../bikeShopConOpts.json')); driver .initialize() .then(runQuery) .then(printResult) .catch(console.error) .finally(() => driver.end()); function runQuery(dataContext) { // Give keys to anyone over 21 that has received a bonus. const query = dataContext .from('staff s') .innerJoin('s.bonuses b') .where( {$gt: {'s.age': ':minAge'}}, {minAge: 21} ) .update({'s.hasStoreKeys': true}); console.log('Query:'); console.log(query.toString(), '\n'); return query .execute(); } function printResult(result) { console.log('Result:'); console.log(result); }
And here's the output ($ node example/update/updateFrom.js):
Query: UPDATE `staff` AS `s` INNER JOIN `bonuses` AS `b` ON `s`.`staffID` = `b`.`staffID` SET `s`.`hasStoreKeys` = :s_hasStoreKeys_0 WHERE `s`.`age` > :minAge Result: { affectedRows: 2 }