-
-
Notifications
You must be signed in to change notification settings - Fork 398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support one whereHas for several filters. #931
Changes from all commits
3b039ae
bdd47a4
b1ce3df
dd3d157
dc32721
e5229e9
f1fac1e
df61b6e
e41fd0a
12f8652
d5b1507
aae87a7
05a18d5
ab7ef1c
8507242
82ca86c
336cc91
462041f
1ee3915
abde873
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
<?php | ||
|
||
namespace Spatie\QueryBuilder; | ||
|
||
use Illuminate\Support\Collection; | ||
use Spatie\QueryBuilder\Contracts\AllowedFilterContract; | ||
|
||
class AllowedRelationshipFilter implements AllowedFilterContract | ||
{ | ||
protected Collection $allowedFilters; | ||
|
||
public function __construct(protected string $relationship, AllowedFilterContract ...$allowedFilters) | ||
{ | ||
$this->allowedFilters = collect($allowedFilters); | ||
} | ||
|
||
public static function group(string $relationship, AllowedFilterContract ...$allowedFilters): self | ||
{ | ||
return new static($relationship, ...$allowedFilters); | ||
} | ||
|
||
public function filter(QueryBuilder $query, $value): void | ||
{ | ||
$query->whereHas($this->relationship, function ($query) use ($value) { | ||
$this->allowedFilters->each( | ||
function (AllowedFilterContract $allowedFilter) use ($query, $value) { | ||
$allowedFilter->filter( | ||
QueryBuilder::for($query), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I might be missing something, but why not pass the current There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tried to swap to
Keeping this as is. |
||
$allowedFilter->getValueFromCollection($value) | ||
); | ||
} | ||
); | ||
}); | ||
} | ||
|
||
public function getNames(): array | ||
{ | ||
return $this->allowedFilters->map( | ||
fn (AllowedFilterContract $allowedFilter) => $allowedFilter->getNames() | ||
)->flatten()->toArray(); | ||
} | ||
|
||
public function isRequested(QueryBuilderRequest $request): bool | ||
{ | ||
return $request->filters()->hasAny($this->getNames()); | ||
} | ||
|
||
public function getValueFromRequest(QueryBuilderRequest $request): Collection | ||
{ | ||
return $request->filters()->only($this->getNames()); | ||
} | ||
|
||
public function getValueFromCollection(Collection $value): Collection | ||
{ | ||
return $value->only($this->getNames()); | ||
} | ||
|
||
public function hasDefault(): bool | ||
{ | ||
return false; | ||
} | ||
|
||
public function getDefault(): null | ||
{ | ||
return null; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
<?php | ||
|
||
namespace Spatie\QueryBuilder\Contracts; | ||
|
||
use Illuminate\Support\Collection; | ||
use Spatie\QueryBuilder\QueryBuilder; | ||
use Spatie\QueryBuilder\QueryBuilderRequest; | ||
|
||
interface AllowedFilterContract | ||
{ | ||
public function isRequested(QueryBuilderRequest $request): bool; | ||
|
||
public function getValueFromRequest(QueryBuilderRequest $request): mixed; | ||
|
||
public function getValueFromCollection(Collection $value): mixed; | ||
|
||
public function filter(QueryBuilder $query, $value); | ||
|
||
public function hasDefault(): bool; | ||
|
||
public function getDefault(): mixed; | ||
|
||
public function getNames(): array; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice little refactor 👍