Skip to content

Commit df797c7

Browse files
committed
Use fully qualified column name for filtering
1 parent 785d39c commit df797c7

File tree

6 files changed

+35
-29
lines changed

6 files changed

+35
-29
lines changed

src/RequestParser.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ private function getModelFromNamespaces(string $modelName, array $modelNamespace
226226

227227
private function applyFilter(Builder $builder, array $filters): Builder
228228
{
229+
/** @var FilterStruct $filterStruct */
229230
foreach ($filters as $filterStruct) {
230231
$builder = $filterStruct->apply($builder);
231232
}

src/Struct/FilterStruct.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,16 @@ private function _apply(Builder $object, $fieldName, $boolean, $isChild = false)
5454
if ($this->isRelation($fieldName)) {
5555
return $this->_applyRelation($object, $fieldName, $boolean, $isChild);
5656
}
57+
58+
$completeFieldName = $object->qualifyColumn($fieldName);
5759
if (array_key_exists($this->operator, self::$WHERE_QUERY_MAPPING)) {
5860
$whereQuery = self::$WHERE_QUERY_MAPPING[$this->operator];
5961
$value = explode(",", $this->value);
6062

61-
return $object->$whereQuery($fieldName, $value, $boolean);
63+
return $object->$whereQuery($completeFieldName, $value, $boolean);
6264
}
6365

64-
return $object->where($fieldName, $this->operator, $this->value, $boolean);
66+
return $object->where($completeFieldName, $this->operator, $this->value, $boolean);
6567
}
6668

6769
private function transformOperator($rawOperator) {

tests/RequestParserLaravelTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function testFilterNormalViaController()
3333

3434
$query = $builder->getQuery();
3535
$this->assertEquals("mock_models", $query->from);
36-
$this->assertEquals("x", $query->wheres[0]['column']);
36+
$this->assertEquals("mock_models.x", $query->wheres[0]['column']);
3737
$this->assertEquals("=", $query->wheres[0]['operator']);
3838
$this->assertEquals([1], $builder->getBindings());
3939
}
@@ -61,7 +61,7 @@ function testFilterNormalViaClosure()
6161

6262
$query = $builder->getQuery();
6363
$this->assertEquals("mock_some_models", $query->from);
64-
$this->assertEquals("x", $query->wheres[0]['column']);
64+
$this->assertEquals("mock_some_models.x", $query->wheres[0]['column']);
6565
$this->assertEquals("=", $query->wheres[0]['operator']);
6666
$this->assertEquals([1], $builder->getBindings());
6767
}

tests/RequestParserLumenTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function() {}
5959

6060
$query = $builder->getQuery();
6161
$this->assertEquals("mock_models", $query->from);
62-
$this->assertEquals("x", $query->wheres[0]['column']);
62+
$this->assertEquals("mock_models.x", $query->wheres[0]['column']);
6363
$this->assertEquals("=", $query->wheres[0]['operator']);
6464
$this->assertEquals([1], $builder->getBindings());
6565
}

tests/RequestParserRelationTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function testFilterRelationOne()
4747

4848
// assert relation query
4949
$this->assertEquals("Basic", $builder->getQuery()->wheres[0]["query"]->wheres[1]["type"]);
50-
$this->assertEquals("id", $builder->getQuery()->wheres[0]["query"]->wheres[1]["column"]);
50+
$this->assertEquals("mock_models.id", $builder->getQuery()->wheres[0]["query"]->wheres[1]["column"]);
5151
$this->assertEquals("=", $builder->getQuery()->wheres[0]["query"]->wheres[1]["operator"]);
5252
$this->assertEquals("2", $builder->getQuery()->wheres[0]["query"]->wheres[1]["value"]);
5353
$this->assertEquals("and", $builder->getQuery()->wheres[0]["query"]->wheres[1]["boolean"]);
@@ -99,7 +99,7 @@ function testFilterOrRelationOne()
9999

100100
// assert first relation query field
101101
$this->assertEquals("Basic", $firstInnerQuery->wheres[1]["type"]);
102-
$this->assertEquals("id", $firstInnerQuery->wheres[1]["column"]);
102+
$this->assertEquals("mock_models.id", $firstInnerQuery->wheres[1]["column"]);
103103
$this->assertEquals("=", $firstInnerQuery->wheres[1]["operator"]);
104104
$this->assertEquals("2", $firstInnerQuery->wheres[1]["value"]);
105105
$this->assertEquals("and", $firstInnerQuery->wheres[1]["boolean"]);
@@ -113,7 +113,7 @@ function testFilterOrRelationOne()
113113

114114
// assert second relation query field
115115
$this->assertEquals("Basic", $secondInnerQuery->wheres[1]["type"]);
116-
$this->assertEquals("other_attr", $secondInnerQuery->wheres[1]["column"]);
116+
$this->assertEquals("mock_models.other_attr", $secondInnerQuery->wheres[1]["column"]);
117117
$this->assertEquals("=", $secondInnerQuery->wheres[1]["operator"]);
118118
$this->assertEquals("2", $secondInnerQuery->wheres[1]["value"]);
119119
$this->assertEquals("and", $secondInnerQuery->wheres[1]["boolean"]);

tests/RequestParserTest.php

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ function testFilterKeywordIn()
186186

187187
$query = $builder->getQuery();
188188
$this->assertEquals("mock_models", $query->from);
189-
$this->assertEquals("y", $query->wheres[0]['column']);
189+
$this->assertEquals("mock_models.y", $query->wheres[0]['column']);
190190
$this->assertEquals("in", strtolower($query->wheres[0]['type']));
191191
$this->assertEquals(['2', '3', '4'], $builder->getBindings());
192192
}
@@ -261,15 +261,15 @@ function testFilterWithOr()
261261
$subquery = $query->wheres[0]['query'];
262262

263263
//Assert subquery components
264-
$this->assertEquals("x", $subquery->wheres[0]['column']);
264+
$this->assertEquals("mock_models.x", $subquery->wheres[0]['column']);
265265
$this->assertEquals("=", strtolower($subquery->wheres[0]['operator']));
266266

267-
$this->assertEquals("y", $subquery->wheres[1]['column']);
267+
$this->assertEquals("mock_models.y", $subquery->wheres[1]['column']);
268268
$this->assertEquals("=", strtolower($subquery->wheres[1]['operator']));
269269
$this->assertEquals("or", strtolower($subquery->wheres[1]['boolean']));
270270

271271
//Assert second where term of the main query
272-
$this->assertEquals("z", $query->wheres[1]['column']);
272+
$this->assertEquals("mock_models.z", $query->wheres[1]['column']);
273273
$this->assertEquals("in", strtolower($query->wheres[1]['type']));
274274

275275
$this->assertEquals(['1', '1', '1', '2', '3'], $builder->getBindings());
@@ -308,14 +308,14 @@ function testFilterWithOrUsingInQueryKeyword()
308308

309309
$subquery1 = $query->wheres[0]['query'];
310310

311-
$this->assertEquals("c", $subquery1->wheres[0]['column']);
311+
$this->assertEquals("mock_models.c", $subquery1->wheres[0]['column']);
312312
$this->assertEquals("in", strtolower($subquery1->wheres[0]['type']));
313313

314-
$this->assertEquals("d", $subquery1->wheres[1]['column']);
314+
$this->assertEquals("mock_models.d", $subquery1->wheres[1]['column']);
315315
$this->assertEquals("in", strtolower($subquery1->wheres[1]['type']));
316316
$this->assertEquals("or", strtolower($subquery1->wheres[1]['boolean']));
317317

318-
$this->assertEquals("i", $query->wheres[1]['column']);
318+
$this->assertEquals("mock_models.i", $query->wheres[1]['column']);
319319
$this->assertEquals("between", strtolower($query->wheres[1]['type']));
320320

321321
$this->assertEquals(
@@ -360,14 +360,14 @@ function testFilterWithOrUsingNotInQueryKeyword()
360360

361361
$subquery1 = $query->wheres[0]['query'];
362362

363-
$this->assertEquals("e", $subquery1->wheres[0]['column']);
363+
$this->assertEquals("mock_models.e", $subquery1->wheres[0]['column']);
364364
$this->assertEquals("NotIn", $subquery1->wheres[0]['type']);
365365

366-
$this->assertEquals("f", $subquery1->wheres[1]['column']);
366+
$this->assertEquals("mock_models.f", $subquery1->wheres[1]['column']);
367367
$this->assertEquals("NotIn", $subquery1->wheres[1]['type']);
368368
$this->assertEquals("or", strtolower($subquery1->wheres[1]['boolean']));
369369

370-
$this->assertEquals("i", $query->wheres[1]['column']);
370+
$this->assertEquals("mock_models.i", $query->wheres[1]['column']);
371371
$this->assertEquals("between", strtolower($query->wheres[1]['type']));
372372

373373
$this->assertEquals(
@@ -412,14 +412,14 @@ function testFilterWithOrUsingBetweenQueryKeyword()
412412

413413
$subquery1 = $query->wheres[0]['query'];
414414

415-
$this->assertEquals("g", $subquery1->wheres[0]['column']);
415+
$this->assertEquals("mock_models.g", $subquery1->wheres[0]['column']);
416416
$this->assertEquals("between", strtolower($subquery1->wheres[0]['type']));
417417

418-
$this->assertEquals("h", $subquery1->wheres[1]['column']);
418+
$this->assertEquals("mock_models.h", $subquery1->wheres[1]['column']);
419419
$this->assertEquals("between", strtolower($subquery1->wheres[1]['type']));
420420
$this->assertEquals("or", strtolower($subquery1->wheres[1]['boolean']));
421421

422-
$this->assertEquals("i", $query->wheres[1]['column']);
422+
$this->assertEquals("mock_models.i", $query->wheres[1]['column']);
423423
$this->assertEquals("between", strtolower($query->wheres[1]['type']));
424424

425425
$this->assertEquals(
@@ -508,6 +508,7 @@ function testFilterOnlyAllowedFilter()
508508
{
509509
$uri = 'some_model';
510510
$controllerClass = MockModelController::class;
511+
$tableName = 'mock_models';
511512
$ignoredKey = "ignored_key";
512513
$nameKey = "name";
513514
$valueKey = "value";
@@ -542,8 +543,8 @@ function testFilterOnlyAllowedFilter()
542543
return $where["column"] == $ignoredKey;
543544
}));
544545

545-
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($nameKey, $valueKey) {
546-
return in_array($where["column"], [$nameKey, $valueKey]);
546+
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($tableName, $nameKey, $valueKey) {
547+
return in_array($where["column"], [sprintf("%s.%s", $tableName, $nameKey), sprintf("%s.%s", $tableName, $valueKey)]);
547548
});
548549
$this->assertEquals(2, count($nameAndValueColumn));
549550
}
@@ -552,6 +553,7 @@ function testFilterIgnoreIgnoredFilter()
552553
{
553554
$uri = 'some_model';
554555
$controllerClass = MockModelController::class;
556+
$tableName = 'mock_models';
555557
$ignoredKey = "omnisearch";
556558
$notIgnoredKey = "selected_value";
557559
$query = new ParameterBag([
@@ -578,18 +580,19 @@ function testFilterIgnoreIgnoredFilter()
578580

579581
$query = $builder->getQuery();
580582

581-
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($ignoredKey) {
582-
return $where["column"] == $ignoredKey;
583+
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($tableName, $ignoredKey) {
584+
return $where["column"] == sprintf("%s.%s", $tableName, $ignoredKey);
583585
}));
584-
$this->assertNotEmpty(array_filter($query->wheres, function ($where) use ($notIgnoredKey) {
585-
return $where["column"] == $notIgnoredKey;
586+
$this->assertNotEmpty(array_filter($query->wheres, function ($where) use ($tableName, $notIgnoredKey) {
587+
return $where["column"] == sprintf("%s.%s", $tableName, $notIgnoredKey);
586588
}));
587589
}
588590

589591
function testFilterIgnoredFilterShouldTakePrecedenceOverAllowedFilter()
590592
{
591593
$uri = 'some_model';
592594
$controllerClass = MockModelController::class;
595+
$tableName = 'mock_models';
593596
$ignoredKey = "ignored_key";
594597
$nameKey = "name";
595598
$valueKey = "value";
@@ -621,8 +624,8 @@ function testFilterIgnoredFilterShouldTakePrecedenceOverAllowedFilter()
621624

622625
$query = $builder->getQuery();
623626

624-
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($nameKey, $valueKey) {
625-
return in_array($where["column"], [$nameKey, $valueKey]);
627+
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($tableName, $nameKey, $valueKey) {
628+
return in_array($where["column"], [sprintf("%s.%s", $tableName, $nameKey), sprintf("%s.%s", $tableName, $valueKey)]);
626629
});
627630
$this->assertEquals(2, count($nameAndValueColumn));
628631
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($ignoredKey) {

0 commit comments

Comments
 (0)