<?php
namespace App\DataFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Request\OrderRequestRequest;
use Doctrine\ORM\QueryBuilder;
class OrderRequestSearchDataFilter extends AbstractContextAwareFilter
{
protected function filterProperty(
string $property,
$value,
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
string $operationName = null
) {
if ($property !== 'search') {
return;
}
if ($resourceClass !== OrderRequestRequest::class) {
return;
}
$parameterName = $queryNameGenerator->generateParameterName($property);
$value = mb_strtolower($value);
$orClause = $this->buildOrClause(
[
'articleNumber',
'customerOrderNumber',
'name',
'orderDetails',
'batchNumber',
'customerProductNumber',
'comment',
],
'p',
$parameterName
);
$queryBuilder
->andWhere(sprintf('(%s)', $orClause))
->setParameter($parameterName, '%'.$value.'%');
}
private function buildOrClause(array $fields, string $table, string $parameterName)
{
$clause = [];
foreach ($fields as $field) {
$clause[] = sprintf('%s.%s LIKE :%s', $table, $field, $parameterName);
}
$clause = implode(' OR ', $clause);
return $clause;
}
public function getDescription(string $resourceClass): array
{
$description = [
'search' => [
'property' => 'search',
'type' => 'string',
'required' => false,
'swagger' => [
'description' => 'Search by the given string case insensitive in multiple fields',
'name' => 'Custom name to use in the Swagger documentation',
'type' => 'Will appear below the name in the Swagger documentation',
],
],
];
return $description;
}
}