Skip to content

Commit e3b2c79

Browse files
authoredFeb 25, 2025··
Merge pull request #25 from DeivisFelipe/main
Relative Filter in many columns with one field
2 parents 49437cf + 8192be6 commit e3b2c79

File tree

2 files changed

+65
-3
lines changed

2 files changed

+65
-3
lines changed
 

‎src/BaseFilter.php

+17-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ abstract class BaseFilter extends BasePipe
1212

1313
protected ?string $searchColumn = null;
1414

15+
protected mixed $searchColumns;
16+
1517
protected mixed $searchValue = null;
1618

1719
public function __construct()
@@ -70,6 +72,18 @@ protected function getSearchColumn()
7072
return $this->searchColumn ?? $this->field;
7173
}
7274

75+
public function filterOnColumns(mixed $searchColumns)
76+
{
77+
$this->searchColumns = $searchColumns;
78+
79+
return $this;
80+
}
81+
82+
protected function getSearchColumns()
83+
{
84+
return $this->searchColumns ?? $this->field;
85+
}
86+
7387
public function ignore(mixed $ignore = '')
7488
{
7589
$this->ignore = $ignore;
@@ -93,11 +107,11 @@ public function detectBy(string $detector)
93107

94108
protected function shouldFilter(string $key)
95109
{
96-
if (isset($this->searchValue)) {
110+
if (isset($this->searchValue)) {
97111
return true;
98-
}
112+
}
99113

100-
if (!$this->request->has($key)) {
114+
if (!$this->request->has($key)) {
101115
return false;
102116
}
103117

‎src/FieldsRelativeFilter.php

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace Baro\PipelineQueryCollection;
4+
5+
use Baro\PipelineQueryCollection\Enums\WildcardPositionEnum;
6+
7+
class FieldsRelativeFilter extends BaseFilter
8+
{
9+
private $wildcardPosition;
10+
11+
public function __construct($field, $columns, WildcardPositionEnum|string $wildcardPosition = null)
12+
{
13+
parent::__construct();
14+
$this->field = $field;
15+
$this->searchColumns = $columns;
16+
if (is_null($wildcardPosition)) {
17+
$wildcardPosition = config('pipeline-query-collection.relative_wildcard_position', WildcardPositionEnum::BOTH);
18+
}
19+
if (!$wildcardPosition instanceof WildcardPositionEnum) {
20+
$wildcardPosition = WildcardPositionEnum::from($wildcardPosition);
21+
}
22+
$this->wildcardPosition = $wildcardPosition;
23+
}
24+
25+
public static function make($field, $columns, WildcardPositionEnum|string $wildcardPosition = null)
26+
{
27+
return new self($field, $columns, $wildcardPosition);
28+
}
29+
30+
protected function apply(): static
31+
{
32+
foreach ($this->getSearchValue() as $value) {
33+
foreach ($this->getSearchColumns() as $column) {
34+
$this->query->where($column, 'like', $this->computeSearchValue($value));
35+
}
36+
}
37+
return $this;
38+
}
39+
40+
private function computeSearchValue($value)
41+
{
42+
return match ($this->wildcardPosition) {
43+
WildcardPositionEnum::RIGHT => "$value%",
44+
WildcardPositionEnum::LEFT => "%$value",
45+
default => "%$value%",
46+
};
47+
}
48+
}

0 commit comments

Comments
 (0)
Please sign in to comment.