7
7
class ConditionDbParser
8
8
{
9
9
10
+ /**
11
+ * @param QueryBuilder $queryBuilder
12
+ * @param Condition|null $condition
13
+ */
10
14
public function parse (QueryBuilder $ queryBuilder , Condition $ condition = null )
11
15
{
12
16
if ($ condition === null ) {
13
17
return ;
14
18
}
15
- foreach ($ condition ->getConditions () as $ cond ) {
16
- if (\is_array ($ cond )) {
17
- $ cond = \array_values ($ cond );
18
- $ type = \array_shift ($ cond );
19
- switch ($ type ) {
20
- case Condition::EQUALS :
21
- $ queryBuilder ->andWhere ("{$ cond [0 ]} = " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
22
- break ;
23
- case Condition::NOT_EQUALS :
24
- $ queryBuilder ->andWhere ("{$ cond [0 ]} <> " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
25
- break ;
26
- case Condition::LESS_THAN :
27
- $ queryBuilder ->andWhere ("{$ cond [0 ]} < " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
28
- break ;
29
- case Condition::GREATER_THAN :
30
- $ queryBuilder ->andWhere ("{$ cond [0 ]} > " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
31
- break ;
32
- case Condition::LESS_OR_EQUALS :
33
- $ queryBuilder ->andWhere ("{$ cond [0 ]} <= " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
34
- break ;
35
- case Condition::GREATER_OR_EQUALS :
36
- $ queryBuilder ->andWhere ("{$ cond [0 ]} >= " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
37
- break ;
38
- case Condition::BETWEEN :
39
- $ queryBuilder ->andWhere ("{$ cond [0 ]} BETWEEN " . $ queryBuilder ->createNamedParameter ($ cond [1 ])
40
- . ' AND ' . $ queryBuilder ->createNamedParameter ($ cond [2 ]));
41
- break ;
42
- case Condition::LIKE :
43
- $ value = $ cond [2 ] ? '% ' : '' ;
44
- $ value .= $ cond [1 ];
45
- $ value .= $ cond [3 ] ? '% ' : '' ;
46
- $ queryBuilder ->andWhere ("{$ cond [0 ]} LIKE " . $ queryBuilder ->createNamedParameter ($ value ));
47
- break ;
48
- case Condition::IN :
49
- if ($ cond [1 ]) {
50
- $ isNumeric = $ cond [2 ];
51
- $ sql = '' ;
52
- /** @var array $values */
53
- $ values = $ cond [1 ];
54
- foreach ($ values as $ v ) {
55
- $ sql .= ($ isNumeric ? (float )$ v : $ queryBuilder ->createNamedParameter ($ v )) . ', ' ;
56
- }
57
- $ queryBuilder ->andWhere ("{$ cond [0 ]} IN ( " . \rtrim ($ sql , ', ' ) . ') ' );
58
- } else {
59
- $ queryBuilder ->andWhere ('1 = 2 ' ); // IN empty array is always false
60
- }
61
- break ;
62
- }
63
- }
64
- }
19
+ $ this ->parseConditions ($ queryBuilder , $ condition );
65
20
66
21
foreach ($ condition ->getSort () as $ field => $ direction ) {
67
22
$ queryBuilder ->orderBy ($ field , $ direction === \SORT_DESC ? 'desc ' : 'asc ' );
@@ -75,4 +30,101 @@ public function parse(QueryBuilder $queryBuilder, Condition $condition = null)
75
30
$ queryBuilder ->setMaxResults ($ limit );
76
31
}
77
32
}
33
+
34
+ /**
35
+ * @param QueryBuilder $queryBuilder
36
+ * @param Condition $condition
37
+ */
38
+ protected function parseConditions (QueryBuilder $ queryBuilder , Condition $ condition )
39
+ {
40
+ foreach ($ condition ->getConditions () as $ cond ) {
41
+ if (!\is_array ($ cond )) {
42
+ continue ;
43
+ }
44
+
45
+ $ cond = \array_values ($ cond );
46
+ $ type = \array_shift ($ cond );
47
+ switch ($ type ) {
48
+ case Condition::EQUALS :
49
+ $ this ->parseSimpleCondition ('= ' , $ queryBuilder , $ cond );
50
+ break ;
51
+ case Condition::NOT_EQUALS :
52
+ $ this ->parseSimpleCondition ('<> ' , $ queryBuilder , $ cond );
53
+ break ;
54
+ case Condition::LESS_THAN :
55
+ $ this ->parseSimpleCondition ('< ' , $ queryBuilder , $ cond );
56
+ break ;
57
+ case Condition::GREATER_THAN :
58
+ $ this ->parseSimpleCondition ('> ' , $ queryBuilder , $ cond );
59
+ break ;
60
+ case Condition::LESS_OR_EQUALS :
61
+ $ this ->parseSimpleCondition ('<= ' , $ queryBuilder , $ cond );
62
+ break ;
63
+ case Condition::GREATER_OR_EQUALS :
64
+ $ this ->parseSimpleCondition ('>= ' , $ queryBuilder , $ cond );
65
+ break ;
66
+ case Condition::BETWEEN :
67
+ $ this ->parseBetweenCondition ($ queryBuilder , $ cond );
68
+ break ;
69
+ case Condition::LIKE :
70
+ $ this ->parseLikeCondition ($ queryBuilder , $ cond );
71
+ break ;
72
+ case Condition::IN :
73
+ $ this ->parseInCondition ($ queryBuilder , $ cond );
74
+ break ;
75
+ }
76
+ }
77
+ }
78
+
79
+ /**
80
+ * @param QueryBuilder $queryBuilder
81
+ * @param $cond
82
+ */
83
+ protected function parseLikeCondition (QueryBuilder $ queryBuilder , $ cond )
84
+ {
85
+ $ value = $ cond [2 ] ? '% ' : '' ;
86
+ $ value .= $ cond [1 ];
87
+ $ value .= $ cond [3 ] ? '% ' : '' ;
88
+ $ queryBuilder ->andWhere ("{$ cond [0 ]} LIKE " . $ queryBuilder ->createNamedParameter ($ value ));
89
+ }
90
+
91
+ /**
92
+ * @param QueryBuilder $queryBuilder
93
+ * @param $cond
94
+ */
95
+ protected function parseInCondition (QueryBuilder $ queryBuilder , $ cond )
96
+ {
97
+ if ($ cond [1 ]) {
98
+ $ isNumeric = $ cond [2 ];
99
+ $ sql = '' ;
100
+ /** @var array $values */
101
+ $ values = $ cond [1 ];
102
+ foreach ($ values as $ v ) {
103
+ $ sql .= ($ isNumeric ? (float )$ v : $ queryBuilder ->createNamedParameter ($ v )) . ', ' ;
104
+ }
105
+ $ queryBuilder ->andWhere ("{$ cond [0 ]} IN ( " . \rtrim ($ sql , ', ' ) . ') ' );
106
+ } else {
107
+ $ queryBuilder ->andWhere ('1 = 2 ' ); // IN empty array is always false
108
+ }
109
+ }
110
+
111
+ /**
112
+ * @param QueryBuilder $queryBuilder
113
+ * @param $cond
114
+ */
115
+ protected function parseBetweenCondition (QueryBuilder $ queryBuilder , $ cond )
116
+ {
117
+ $ queryBuilder ->andWhere ("{$ cond [0 ]} BETWEEN " . $ queryBuilder ->createNamedParameter ($ cond [1 ])
118
+ . ' AND ' . $ queryBuilder ->createNamedParameter ($ cond [2 ]));
119
+ }
120
+
121
+ /**
122
+ * @param string $exp
123
+ * @param QueryBuilder $queryBuilder
124
+ * @param $cond
125
+ */
126
+ protected function parseSimpleCondition (string $ exp , QueryBuilder $ queryBuilder , $ cond )
127
+ {
128
+ $ queryBuilder ->andWhere ("{$ cond [0 ]} $ exp " . $ queryBuilder ->createNamedParameter ($ cond [1 ]));
129
+ }
78
130
}
0 commit comments