In a controller, using findAll()
, I am trying to create a where clause to return all hits regardless of punctuation in the search string. Currently, punctuation is dictating what is returned even though i'm using the [Op.iLike]
operator.
Example:
search
can either be 'St Andrew'
or 'St. Andrew'
In the following example: if search === 'St. Andrew'
returns only results with the St. Andrew
And, if search === 'St Andrew'
, it only returns the results with St Andrew
where: { name: { [Op.iLike]: `%${search}%` } },
In the following example: if search === 'St. Andrew'
returns all intended results (results with or without the .
)
Howerver, if search === 'St Andrew'
, it only returns the results without the .
const noPunctuationSearch = search?.replace(/[^A-Za-z0-9] /g, ' ');
where: {
name: {
[Op.or]: [
{ [Op.iLike]: `%${search}%` },
{ [Op.iLike]: `%${noPunctuationSearch}%` },
],
},
},
How do I set up the where clause and Operators to return all St. Andrew || St Andrew
results regardless of the punctuation in search
?
CodePudding user response:
You could use Op.iRegexp
but you will need to massage the query a bit more to create a regular expression out of it.
const search = 'St. Andrews';
const noPuncuationSearch = search?.replace(/[^A-Za-z0-9] /g,'[^A-Za-z0-9] ');
where: {
name: {
[Op.iRegexp]: noPuncuationSearch,
},
},