diff --git a/package-lock.json b/package-lock.json index d0c044a..63df2f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/database", - "version": "5.53.0", + "version": "5.54.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/database", - "version": "5.53.0", + "version": "5.54.0", "license": "MIT", "dependencies": { "@faker-js/faker": "^8.4.1" diff --git a/package.json b/package.json index 5b3b5c1..9bdc280 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/database", - "version": "5.53.0", + "version": "5.54.0", "description": "The Athenna database handler for SQL/NoSQL.", "license": "MIT", "author": "João Lenon ", diff --git a/src/models/builders/ModelQueryBuilder.ts b/src/models/builders/ModelQueryBuilder.ts index 9a44e09..f659d47 100644 --- a/src/models/builders/ModelQueryBuilder.ts +++ b/src/models/builders/ModelQueryBuilder.ts @@ -940,15 +940,8 @@ export class ModelQueryBuilder< */ public where(statement: any, operation?: any | Operations, value?: any) { if (Is.Function(statement)) { - const driver = this.driver.clone() - super.where(query => { - const modelQb = new ModelQueryBuilder( - this.Model, - driver.setQueryBuilder(query, { useSetQB: true }) - ) - - statement(modelQb) + statement(new ModelQueryBuilder(this.Model, query as unknown as Driver)) }) return this @@ -979,15 +972,8 @@ export class ModelQueryBuilder< */ public whereNot(statement: any, value?: any) { if (Is.Function(statement)) { - const driver = this.driver.clone() - super.whereNot(query => { - const modelQb = new ModelQueryBuilder( - this.Model, - driver.setQueryBuilder(query, { useSetQB: true }) - ) - - statement(modelQb) + statement(new ModelQueryBuilder(this.Model, query as unknown as Driver)) }) return this @@ -1125,15 +1111,8 @@ export class ModelQueryBuilder< */ public orWhere(statement: any, operation?: any | Operations, value?: any) { if (Is.Function(statement)) { - const driver = this.driver.clone() - super.orWhere(query => { - const modelQb = new ModelQueryBuilder( - this.Model, - driver.setQueryBuilder(query, { useSetQB: true }) - ) - - statement(modelQb) + statement(new ModelQueryBuilder(this.Model, query as unknown as Driver)) }) return this @@ -1164,15 +1143,8 @@ export class ModelQueryBuilder< */ public orWhereNot(statement: any, value?: any) { if (Is.Function(statement)) { - const driver = this.driver.clone() - super.orWhereNot(query => { - const modelQb = new ModelQueryBuilder( - this.Model, - driver.setQueryBuilder(query, { useSetQB: true }) - ) - - statement(modelQb) + statement(new ModelQueryBuilder(this.Model, query as unknown as Driver)) }) return this diff --git a/tests/unit/models/relations/BelongsTo/BelongsToRelationTest.ts b/tests/unit/models/relations/BelongsTo/BelongsToRelationTest.ts index c05e6b2..fc645e8 100644 --- a/tests/unit/models/relations/BelongsTo/BelongsToRelationTest.ts +++ b/tests/unit/models/relations/BelongsTo/BelongsToRelationTest.ts @@ -316,4 +316,32 @@ export default class BelongsToRelationTest { assert.isUndefined(product.user) assert.instanceOf(profile, Profile) } + + @Test() + public async shouldFilterByRelationColumnInsideAGroupedWhereClosure({ assert }: Context) { + const matching = await Product.query() + .where(qb => qb.whereHas('user', q => q.where('id', 1))) + .findMany() + + assert.instanceOf(matching[0], Product) + assert.equal(matching.length, 1) + + const none = await Product.query() + .where(qb => qb.whereHas('user', q => q.where('id', 99))) + .findMany() + + assert.lengthOf(none, 0) + } + + @Test() + public async shouldFilterUsingSearchAcrossDirectAndRelationColumns({ assert }: Context) { + const matchingByRelation = await Product.query().search(['user.name'], 'lenon').findMany() + + assert.equal(matchingByRelation.length, 1) + assert.instanceOf(matchingByRelation[0], Product) + + const noneByRelation = await Product.query().search(['user.name'], 'nobody').findMany() + + assert.lengthOf(noneByRelation, 0) + } }