Skip to content

Commit ef4c5c8

Browse files
Merge pull request #266 from MasoniteFramework/feature/265
Adds where like to query builder
2 parents e0a7ed3 + aa9dbc2 commit ef4c5c8

14 files changed

+205
-3
lines changed

src/masoniteorm/query/QueryBuilder.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,9 @@ def where_raw(self, query: str, bindings=()):
485485
Returns:
486486
self
487487
"""
488-
self._wheres += ((QueryExpression(query, "=", None, "value", raw=True)),)
488+
self._wheres += (
489+
(QueryExpression(query, "=", None, "value", raw=True, bindings=bindings)),
490+
)
489491
return self
490492

491493
def or_where(self, column: [str, int], *args) -> "self":
@@ -1355,7 +1357,7 @@ def min(self, column):
13551357

13561358
def _extract_operator_value(self, *args):
13571359

1358-
operators = ["=", ">", ">=", "<", "<=", "!=", "<>"]
1360+
operators = ["=", ">", ">=", "<", "<=", "!=", "<>", "like", "not like"]
13591361

13601362
operator = operators[0]
13611363

src/masoniteorm/query/grammars/BaseGrammar.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,13 @@ def process_wheres(self, qmark=False, strip_first_where=False):
392392
keyword=keyword, query=where.column
393393
)
394394

395-
self.add_binding(where.bindings)
395+
if not isinstance(where.bindings, (list, tuple)):
396+
raise ValueError(
397+
f"Binings must be tuple or list. Received {type(where.bindings)}"
398+
)
399+
400+
if where.bindings:
401+
self.add_binding(*where.bindings)
396402

397403
continue
398404

@@ -427,6 +433,10 @@ def process_wheres(self, qmark=False, strip_first_where=False):
427433
sql_string = self.where_not_null_string()
428434
elif equality == "EXISTS":
429435
sql_string = self.where_exists_string()
436+
elif equality.upper() == "LIKE":
437+
sql_string = self.where_like_string()
438+
elif equality.upper() == "NOT LIKE":
439+
sql_string = self.where_not_like_string()
430440
else:
431441
sql_string = self.where_string()
432442

src/masoniteorm/query/grammars/MSSQLGrammar.py

+6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ def having_string(self):
5353
def where_exists_string(self):
5454
return "{keyword} EXISTS {value}"
5555

56+
def where_like_string(self):
57+
return "{keyword} {column} LIKE {value}"
58+
59+
def where_not_like_string(self):
60+
return "{keyword} {column} NOT LIKE {value}"
61+
5662
def having_equality_string(self):
5763
return "HAVING {column} {equality} {value}"
5864

src/masoniteorm/query/grammars/MySQLGrammar.py

+6
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ def not_between_string(self):
113113
def where_exists_string(self):
114114
return "{keyword} EXISTS {value}"
115115

116+
def where_like_string(self):
117+
return "{keyword} {column} LIKE {value}"
118+
119+
def where_not_like_string(self):
120+
return "{keyword} {column} NOT LIKE {value}"
121+
116122
def subquery_alias_string(self):
117123
return "AS {alias}"
118124

src/masoniteorm/query/grammars/PostgresGrammar.py

+6
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ def not_between_string(self):
6666
def where_exists_string(self):
6767
return "{keyword} EXISTS {value}"
6868

69+
def where_like_string(self):
70+
return "{keyword} {column} LIKE {value}"
71+
72+
def where_not_like_string(self):
73+
return "{keyword} {column} NOT LIKE {value}"
74+
6975
def subquery_alias_string(self):
7076
return "AS {alias}"
7177

src/masoniteorm/query/grammars/SQLiteGrammar.py

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ def not_between_string(self):
6969
def where_exists_string(self):
7070
return "{keyword} EXISTS {value}"
7171

72+
def where_like_string(self):
73+
return "{keyword} {column} LIKE {value}"
74+
75+
def where_not_like_string(self):
76+
return "{keyword} {column} NOT LIKE {value}"
77+
7278
def subquery_alias_string(self):
7379
return "AS {alias}"
7480

src/masoniteorm/testing/BaseTestCaseSelectGrammar.py

+14
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,17 @@ def test_can_compile_first_or_fail(self):
307307
self, inspect.currentframe().f_code.co_name.replace("test_", "")
308308
)()
309309
self.assertEqual(to_sql, sql)
310+
311+
def test_where_like(self):
312+
to_sql = self.builder.where("age", "like", "%name%").to_sql()
313+
sql = getattr(
314+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
315+
)()
316+
self.assertEqual(to_sql, sql)
317+
318+
def test_where_not_like(self):
319+
to_sql = self.builder.where("age", "not like", "%name%").to_sql()
320+
sql = getattr(
321+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
322+
)()
323+
self.assertEqual(to_sql, sql)

tests/mssql/grammar/test_mssql_select_grammar.py

+14
Original file line numberDiff line numberDiff line change
@@ -279,3 +279,17 @@ def can_compile_first_or_fail(self):
279279
builder.where("is_admin", "=", True).first_or_fail()
280280
"""
281281
return """SELECT TOP 1 * FROM [users] WHERE [users].[is_admin] = '1'"""
282+
283+
def where_like(self):
284+
"""
285+
builder = self.get_builder()
286+
builder.where("age", "like", "%name%")
287+
"""
288+
return """SELECT * FROM [users] WHERE [users].[age] LIKE '%name%'"""
289+
290+
def where_not_like(self):
291+
"""
292+
builder = self.get_builder()
293+
builder.where("age", "like", "%name%")
294+
"""
295+
return """SELECT * FROM [users] WHERE [users].[age] NOT LIKE '%name%'"""

tests/mysql/builder/test_query_builder.py

+32
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ def test_with_(self):
5050
)()
5151
self.assertEqual(builder.to_sql(), sql)
5252

53+
def test_where_like(self):
54+
builder = self.get_builder()
55+
builder.where("age", "like", "%name%")
56+
57+
sql = getattr(
58+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
59+
)()
60+
self.assertEqual(builder.to_sql(), sql)
61+
62+
def test_where_not_like(self):
63+
builder = self.get_builder()
64+
builder.where("age", "not like", "%name%")
65+
66+
sql = getattr(
67+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
68+
)()
69+
self.assertEqual(builder.to_sql(), sql)
70+
5371
def test_max(self):
5472
builder = self.get_builder()
5573
builder.max("age")
@@ -653,3 +671,17 @@ def or_where(self):
653671
return (
654672
"SELECT * FROM `users` WHERE `users`.`age` = '20' OR `users`.`age` < '20'"
655673
)
674+
675+
def where_like(self):
676+
"""
677+
builder = self.get_builder()
678+
builder.where("age", "like", "%name%")
679+
"""
680+
return "SELECT * FROM `users` WHERE `users`.`age` LIKE '%name%'"
681+
682+
def where_not_like(self):
683+
"""
684+
builder = self.get_builder()
685+
builder.where("age", "not like", "%name%")
686+
"""
687+
return "SELECT * FROM `users` WHERE `users`.`age` NOT LIKE '%name%'"

tests/mysql/grammar/test_mysql_select_grammar.py

+14
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,17 @@ def can_compile_first_or_fail(self):
273273
builder.where("is_admin", "=", True).first_or_fail()
274274
"""
275275
return """SELECT * FROM `users` WHERE `users`.`is_admin` = '1' LIMIT 1"""
276+
277+
def where_not_like(self):
278+
"""
279+
builder = self.get_builder()
280+
builder.where("age", "not like", "%name%").to_sql()
281+
"""
282+
return "SELECT * FROM `users` WHERE `users`.`age` NOT LIKE '%name%'"
283+
284+
def where_like(self):
285+
"""
286+
builder = self.get_builder()
287+
builder.where("age", "not like", "%name%").to_sql()
288+
"""
289+
return "SELECT * FROM `users` WHERE `users`.`age` LIKE '%name%'"

tests/postgres/builder/test_postgres_query_builder.py

+32
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ def test_sum(self):
4040
)()
4141
self.assertEqual(builder.to_sql(), sql)
4242

43+
def test_where_like(self):
44+
builder = self.get_builder()
45+
builder.where("age", "like", "%name%")
46+
47+
sql = getattr(
48+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
49+
)()
50+
self.assertEqual(builder.to_sql(), sql)
51+
52+
def test_where_not_like(self):
53+
builder = self.get_builder()
54+
builder.where("age", "not like", "%name%")
55+
56+
sql = getattr(
57+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
58+
)()
59+
self.assertEqual(builder.to_sql(), sql)
60+
4361
def test_max(self):
4462
builder = self.get_builder()
4563
builder.max("age")
@@ -635,3 +653,17 @@ def or_where(self):
635653
builder.where('age', '20').or_where('age','<', 20)
636654
"""
637655
return """SELECT * FROM "users" WHERE "users"."age" = '20' OR "users"."age" < '20'"""
656+
657+
def where_like(self):
658+
"""
659+
builder = self.get_builder()
660+
builder.where("age", "like", "%name%")
661+
"""
662+
return """SELECT * FROM "users" WHERE "users"."age" LIKE '%name%'"""
663+
664+
def where_not_like(self):
665+
"""
666+
builder = self.get_builder()
667+
builder.where("age", "not like", "%name%")
668+
"""
669+
return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'"""

tests/postgres/grammar/test_select_grammar.py

+14
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,17 @@ def can_compile_first_or_fail(self):
273273
builder.where("is_admin", "=", True).first_or_fail()
274274
"""
275275
return """SELECT * FROM "users" WHERE "users"."is_admin" = '1' LIMIT 1"""
276+
277+
def where_not_like(self):
278+
"""
279+
builder = self.get_builder()
280+
builder.where("age", "not like", "%name%").to_sql()
281+
"""
282+
return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'"""
283+
284+
def where_like(self):
285+
"""
286+
builder = self.get_builder()
287+
builder.where("age", "not like", "%name%").to_sql()
288+
"""
289+
return """SELECT * FROM "users" WHERE "users"."age" LIKE '%name%'"""

tests/sqlite/builder/test_sqlite_query_builder.py

+32
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ def test_sum(self):
3030
)()
3131
self.assertEqual(builder.to_sql(), sql)
3232

33+
def test_where_like(self):
34+
builder = self.get_builder()
35+
builder.where("age", "like", "%name%")
36+
37+
sql = getattr(
38+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
39+
)()
40+
self.assertEqual(builder.to_sql(), sql)
41+
42+
def test_where_not_like(self):
43+
builder = self.get_builder()
44+
builder.where("age", "not like", "%name%")
45+
46+
sql = getattr(
47+
self, inspect.currentframe().f_code.co_name.replace("test_", "")
48+
)()
49+
self.assertEqual(builder.to_sql(), sql)
50+
3351
def test_max(self):
3452
builder = self.get_builder()
3553
builder.max("age")
@@ -636,3 +654,17 @@ def or_where(self):
636654
builder.where('age', '20').or_where('age','<', 20)
637655
"""
638656
return """SELECT * FROM "users" WHERE "users"."age" = '20' OR "users"."age" < '20'"""
657+
658+
def where_like(self):
659+
"""
660+
builder = self.get_builder()
661+
builder.where("age", "like", "%name%")
662+
"""
663+
return """SELECT * FROM "users" WHERE "users"."age" LIKE '%name%'"""
664+
665+
def where_not_like(self):
666+
"""
667+
builder = self.get_builder()
668+
builder.where("age", "like", "%name%")
669+
"""
670+
return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'"""

tests/sqlite/grammar/test_sqlite_select_grammar.py

+14
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,17 @@ def can_compile_first_or_fail(self):
273273
builder.where("is_admin", "=", True).first_or_fail()
274274
"""
275275
return """SELECT * FROM "users" WHERE "users"."is_admin" = '1' LIMIT 1"""
276+
277+
def where_not_like(self):
278+
"""
279+
builder = self.get_builder()
280+
builder.where("age", "not like", "%name%").to_sql()
281+
"""
282+
return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'"""
283+
284+
def where_like(self):
285+
"""
286+
builder = self.get_builder()
287+
builder.where("age", "not like", "%name%").to_sql()
288+
"""
289+
return """SELECT * FROM "users" WHERE "users"."age" LIKE '%name%'"""

0 commit comments

Comments
 (0)