Add whereLike functions (#5044)

This commit is contained in:
Olivier Cavadenti 2022-03-01 20:19:35 +01:00 committed by GitHub
parent 3616791ac2
commit 106a881e20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 118 additions and 2 deletions

View File

@ -27,12 +27,16 @@ module.exports = [
'fullOuterJoin',
'crossJoin',
'where',
'whereLike',
'whereILike',
'andWhere',
'orWhere',
'whereNot',
'orWhereNot',
'whereLike',
'andWhereLike',
'orWhereLike',
'whereILike',
'andWhereILike',
'orWhereILike',
'whereRaw',
'whereWrapped',
'havingWrapped',

View File

@ -691,11 +691,21 @@ class Builder extends EventEmitter {
return this._whereLike('whereLike', column, value);
}
// Adds a `or where like` clause to the query.
orWhereLike(column, value) {
return this._bool('or')._whereLike('whereLike', column, value);
}
// Adds a `where ilike` clause to the query.
whereILike(column, value) {
return this._whereLike('whereILike', column, value);
}
// Adds a `or where ilike` clause to the query.
orWhereILike(column, value) {
return this._bool('or')._whereLike('whereILike', column, value);
}
// Adds a `group by` clause to the query.
groupBy(item) {
if (item && item.isRawInstance) {
@ -1725,6 +1735,8 @@ Builder.prototype.andWhereNotBetween = Builder.prototype.whereNotBetween;
Builder.prototype.andWhereJsonObject = Builder.prototype.whereJsonObject;
Builder.prototype.andWhereNotJsonObject = Builder.prototype.whereJsonObject;
Builder.prototype.andWhereJsonPath = Builder.prototype.whereJsonPath;
Builder.prototype.andWhereLike = Builder.prototype.whereLike;
Builder.prototype.andWhereILike = Builder.prototype.whereILike;
Builder.prototype.andHaving = Builder.prototype.having;
Builder.prototype.andHavingIn = Builder.prototype.havingIn;
Builder.prototype.andHavingNotIn = Builder.prototype.havingNotIn;

View File

@ -584,6 +584,52 @@ describe('Where', function () {
expect(result[0].email).to.equal('test1@example.com');
});
it('finds data using orWhereLike', async () => {
const result = await knex('accounts')
.select('*')
.whereLike('email', 'test1%')
.orWhereLike('email', 'test2%');
expect(result[0].email).to.equal('test1@example.com');
expect(result[1].email).to.equal('test2@example.com');
});
it('finds data using andWhereLike', async () => {
const result = await knex('accounts')
.select('*')
.whereLike('first_name', 'Te%')
.andWhereLike('email', '%example.com');
expect(result.length).to.equal(6);
expect(result[0].email).to.equal('test1@example.com');
expect(result[1].email).to.equal('test2@example.com');
expect(result[2].email).to.equal('test3@example.com');
expect(result[3].email).to.equal('test4@example.com');
expect(result[4].email).to.equal('test5@example.com');
expect(result[5].email).to.equal('test6@example.com');
});
it('finds data using orWhereILike', async () => {
const result = await knex('accounts')
.select('*')
.whereILike('email', 'TEST1%')
.orWhereILike('email', 'TeSt2%');
expect(result[0].email).to.equal('test1@example.com');
expect(result[1].email).to.equal('test2@example.com');
});
it('finds data using andWhereILike', async () => {
const result = await knex('accounts')
.select('*')
.whereILike('first_name', 'te%')
.andWhereILike('email', '%examPle.COm');
expect(result.length).to.equal(6);
expect(result[0].email).to.equal('test1@example.com');
expect(result[1].email).to.equal('test2@example.com');
expect(result[2].email).to.equal('test3@example.com');
expect(result[3].email).to.equal('test4@example.com');
expect(result[4].email).to.equal('test5@example.com');
expect(result[5].email).to.equal('test6@example.com');
});
it("doesn't find data using whereLike when different case sensitivity", async () => {
const result = await knex('accounts').whereLike('email', 'Test1%');
expect(result).to.deep.equal([]);

View File

@ -882,6 +882,56 @@ describe('QueryBuilder', () => {
});
});
it('uses andWhereLike, orWhereLike #2265', () => {
testsql(
qb()
.select('*')
.from('users')
.whereLike('name', 'luk1%')
.andWhereLike('name', 'luk2%')
.orWhereLike('name', 'luk3%'),
{
mysql: {
sql: 'select * from `users` where `name` like ? COLLATE utf8_bin and `name` like ? COLLATE utf8_bin or `name` like ? COLLATE utf8_bin',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
pg: {
sql: 'select * from "users" where "name" like ? and "name" like ? or "name" like ?',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
mssql: {
sql: 'select * from [users] where [name] collate SQL_Latin1_General_CP1_CS_AS like ? and [name] collate SQL_Latin1_General_CP1_CS_AS like ? or [name] collate SQL_Latin1_General_CP1_CS_AS like ?',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
}
);
});
it('uses andWhereILike, orWhereILike #2265', () => {
testsql(
qb()
.select('*')
.from('users')
.whereILike('name', 'luk1%')
.andWhereILike('name', 'luk2%')
.orWhereILike('name', 'luk3%'),
{
mysql: {
sql: 'select * from `users` where `name` like ? and `name` like ? or `name` like ?',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
pg: {
sql: 'select * from "users" where "name" ilike ? and "name" ilike ? or "name" ilike ?',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
mssql: {
sql: 'select * from [users] where [name] collate SQL_Latin1_General_CP1_CI_AS like ? and [name] collate SQL_Latin1_General_CP1_CI_AS like ? or [name] collate SQL_Latin1_General_CP1_CI_AS like ?',
bindings: ['luk1%', 'luk2%', 'luk3%'],
},
}
);
});
it('whereColumn', () => {
testsql(
qb()

4
types/index.d.ts vendored
View File

@ -527,7 +527,11 @@ export declare namespace Knex {
whereNotIn: WhereIn<TRecord, TResult>;
orWhereNotIn: WhereIn<TRecord, TResult>;
whereLike: Where<TRecord, TResult>;
andWhereLike: Where<TRecord, TResult>;
orWhereLike: Where<TRecord, TResult>;
whereILike: Where<TRecord, TResult>;
andWhereILike: Where<TRecord, TResult>;
orWhereILike: Where<TRecord, TResult>;
whereNull: WhereNull<TRecord, TResult>;
orWhereNull: WhereNull<TRecord, TResult>;
whereNotNull: WhereNull<TRecord, TResult>;