diff --git a/lib/mysql.js b/lib/mysql.js index e796df7..7033a80 100644 --- a/lib/mysql.js +++ b/lib/mysql.js @@ -388,11 +388,27 @@ MySQL.prototype.getColumns = function (model, props) { return names.join(', '); }; -function buildWhere(self, model, conds) { +MySQL.prototype.buildWhere = function (model, conds) { + var where = this._buildWhere(model, conds); + return where? 'WHERE ' + where : ''; +}; + +MySQL.prototype._buildWhere = function (model, conds) { + var self = this; var props = self._models[model].properties; var cs = []; Object.keys(conds).forEach(function (key) { + if (key === 'and' || key === 'or') { + var clauses = conds[key]; + if (Array.isArray(clauses)) { + clauses = clauses.map(function (c) { + return '(' + self._buildWhere(model, c) + ')'; + }); + return cs.push(clauses.join(' ' + key.toUpperCase() + ' ')); + } + // The value is not an array, fall back to regular fields + } var keyEscaped = self.columnEscaped(model, key); var val = self.toDatabase(props[key], conds[key]); if (conds[key] === null || conds[key] === undefined) { @@ -439,7 +455,7 @@ function buildWhere(self, model, conds) { if (cs.length === 0) { return ''; } - return 'WHERE ' + cs.join(' AND '); + return cs.join(' AND '); } function buildOrderBy(self, model, order) { @@ -482,7 +498,7 @@ MySQL.prototype.all = function all(model, filter, callback) { if (filter) { if (filter.where) { - sql += ' ' + buildWhere(self, model, filter.where); + sql += ' ' + self.buildWhere(model, filter.where); } if (filter.order) { @@ -528,8 +544,9 @@ MySQL.prototype.destroyAll = function destroyAll(model, where, callback) { where = undefined; } this.query('DELETE FROM ' - + this.tableEscaped(model) + ' ' + buildWhere(this, model, where || {}), function (err, data) { - callback && callback(err, data); + + this.tableEscaped(model) + ' ' + this.buildWhere(model, where || {}), + function (err, data) { + callback && callback(err, data); }.bind(this)); };