diff --git a/lib/queryBuilder/operations/eager/WhereInEagerOperation.js b/lib/queryBuilder/operations/eager/WhereInEagerOperation.js index edee68309..2f9273b6f 100644 --- a/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +++ b/lib/queryBuilder/operations/eager/WhereInEagerOperation.js @@ -4,7 +4,7 @@ const promiseUtils = require('../../../utils/promiseUtils'); const { EagerOperation } = require('./EagerOperation'); const { isMsSql, isOracle, isSqlite } = require('../../../utils/knexUtils'); -const { asArray, flatten, chunk } = require('../../../utils/objectUtils'); +const { isObject, asArray, flatten, chunk } = require('../../../utils/objectUtils'); const { ValidationErrorType } = require('../../../model/ValidationError'); const { createModifier } = require('../../../utils/createModifier'); const { RelationDoesNotExistError } = require('../../../model/RelationDoesNotExistError'); @@ -63,7 +63,8 @@ class WhereInEagerOperation extends EagerOperation { const models = asArray(result); - if (!models.length) { + // Check models to be actual objects, to filter out `count` results (#2397). + if (!models.length || !isObject(models[0])) { return result; } diff --git a/tests/integration/patch.js b/tests/integration/patch.js index c72597842..dd9a77fda 100644 --- a/tests/integration/patch.js +++ b/tests/integration/patch.js @@ -4,7 +4,7 @@ const expect = require('expect.js'); const Promise = require('bluebird'); const { inheritModel } = require('../../lib/model/inheritModel'); const { expectPartialEqual: expectPartEql } = require('./../../testUtils/testUtils'); -const { Model, ValidationError, raw } = require('../../'); +const { Model, QueryBuilder, ValidationError, raw } = require('../../'); const { isPostgres, isSqlite } = require('../../lib/utils/knexUtils'); const mockKnexFactory = require('../../testUtils/mockKnex'); @@ -330,6 +330,32 @@ module.exports = (session) => { }); }); }); + + it('should not attempt to eager-load relations on patch `count` results when using overwritten `execute()` to load relations (#2397)', () => { + let runBeforeCalled = 0; + + class MyModel1 extends Model1 {} + + MyModel1.QueryBuilder = class MyQueryBuilder1 extends QueryBuilder { + execute() { + this.withGraphFetched('model1Relation2'); + return super.execute(); + } + }; + + return MyModel1.query() + .context({ + runBefore() { + runBeforeCalled++; + }, + }) + .where({ id: 1 }) + .patch({ model1Prop1: 'updated text' }) + .then((count) => { + expect(count).to.eql(1); + expect(runBeforeCalled).to.eql(1); + }); + }); }); describe('.query().patchAndFetchById()', () => {