$ composer require paliari/doctrine-ransack
Your setup, example
<?php
use Paliari\Doctrine\Ransack;
use Paliari\Doctrine\RansackConfig;
$ransack = new Ransack(new RansackConfig($entityManager));
<?php
use Paliari\Doctrine\Ransack;
use Paliari\Doctrine\RansackConfig;
use Paliari\Doctrine\VO\RansackOrderByVO;
use Paliari\Doctrine\VO\RansackParamsVO;
$entityName = User::class;
$alias = 't';
$paramsVO = new RansackParamsVO();
$paramsVO->where = [
'person.address.street_cont' => 'Av% Brasil',
'or' => [
'name_eq' => 'Jhon',
'email_start' => 'jhon',
'person.address.city_eq' => 'Maringá',
],
'id_order_by' => 'asc',
];
$paramsVO->orderBy = [
new RansackOrderByVO(['field' => 'person.name', 'order' => 'ASC']),
new RansackOrderByVO(['field' => 'person.id', 'order' => 'DESC']),
];
$paramsVO->groupBy = [
'person.name',
'person.address_id',
];
$qb = $entityManager->createQueryBuilder()->from($entityName, $alias);
$ransackBuilder = $this->ransack
->query($qb, $entityName, $alias)
->includes()
->where($paramsVO);
$users = $ransackBuilder->getQuery()->getResult();
// Using includes
$includes = [
'only' => ['id', 'email'],
'include' => [
'person' ['only' => ['id', 'name']],
],
];
$rows = $ransackBuilder->includes($includes)->getArrayResult();
Your class of get custom association
<?php
use Doctrine\ORM\Query\Expr\Join;
use Paliari\Doctrine\CustomAssociationInterface;
use Paliari\Doctrine\VO\RelationVO;
use Paliari\Doctrine\VO\JoinVO;
use Person;
use User;
class CustomAssociation implements CustomAssociationInterface
{
public function __invoke(string $entityName, string $alias, string $field): ?RelationVO
{
if (User::class === $entityName && 'custom' == $field) {
$relationVO = new RelationVO();
$relationVO->entityName = $entityName;
$relationVO->fieldName = $field;
$relationVO->targetEntity = Person::class;
$joinVO = new JoinVO();
$joinVO->join = Person::class;
$joinVO->alias = "{$alias}_$field";
$joinVO->conditionType = Join::WITH;
$joinVO->condition = "$alias.email = $joinVO->alias.email";
$relationVO->join = $joinVO;
return $relationVO;
}
return null;
}
}
Setup with CustomAssociation
<?php
use Paliari\Doctrine\Ransack;
use Paliari\Doctrine\RansackConfig;
$customAssociation = new CustomAssociation();
$config = new RansackConfig($entityManager, $customAssociation);
$ransack = new Ransack($config);
$entityName = User::class;
$alias = 't';
$paramsVO = new RansackParamsVO();
$paramsVO->where = [
'custom.email_eq' => 'your-email@gmail.com',
];
$includes = [
'only' => ['id', 'email'],
'include' => [
'custom' ['only' => ['id', 'name']],
],
];
$qb = $entityManager->createQueryBuilder()->from($entityName, $alias);
$ransackBuilder = $this->ransack
->query($qb, $entityName, $alias)
->includes()
->where($paramsVO);
$users = $ransackBuilder->getQuery()->getResult();
The filters must be passed in a hash with the name of
the key containing the field ending with the predicates
below ex: person.name_eq
, person.id_gt
.
It is also possible to combine predicates within or
or and
clauses, eg:
$where = [
'name_cont' => 'Jhon',
'or' => [
'person.name_start' => 'Jhon',
'person.email_end' => '@gmail.com',
'and' => [
'person.address.city_eq' => 'Maringá',
'person.address.state_eq' => 'PR',
],
],
];
-
-
Example:
{"col_eq": "Fulano da Silva"}
-
SQL result:
WHERE col = 'Fulano da Silva'
-
-
-
Example:
{"col_not_eq": "Fulano da Silva"}
-
SQL result:
WHERE col <> 'Fulano da Silva'
-
-
-
Example:
{"col_in": [13, 21, 124, 525]}
-
SQL result:
WHERE col IN (13, 21, 124, 525)
-
-
-
Example:
{"col_not_in": [13, 21, 124, 525]}
-
SQL result:
WHERE col NOT IN (13, 21, 124, 525)
-
-
-
Example:
{"col_null": null}
-
SQL result:
WHERE col IS NULL
-
-
-
Example:
{"col_not_null": null}
-
SQL result:
WHERE col IS NOT NULL
-
-
Only compatible with string columns.
-
Example:
{"col_present": 1}
-
SQL result:
WHERE col IS NOT NULL AND col != ''
-
-
Only compatible with string columns.
-
Example:
{"col_blank": 1}
-
SQL result:
WHERE col IS NULL OR col = ''
-
-
-
Example:
{"col_lt": 25}
-
SQL result:
WHERE col < 25
-
-
-
Example:
{"col_lteq": 25}
-
SQL result:
WHERE col <= 25
-
-
-
Example:
{"col_gt": 25}
-
SQL result:
WHERE col > 25
-
-
-
Example:
{"col_gteq": 25}
-
SQL result:
WHERE col >= 25
-
-
-
Example:
{"col_matches": "Fulano"}
-
SQL result:
WHERE col LIKE 'Fulano'
-
-
-
Example:
{"col_not_matches": "Fulano"}
-
SQL result:
WHERE col NOT LIKE 'Fulano'
-
-
-
Example:
{"col_cont": "Fulano"}
-
SQL result:
WHERE col LIKE '%Fulano%'
-
-
-
Example:
{"col_not_cont": "Fulano Silva"}
-
SQL result:
WHERE col NOT LIKE '%Fulano%Silva%'
-
-
-
Example:
{"col_start": "Fulano"}
-
SQL result:
WHERE col LIKE 'Fulano%'
-
-
-
Example:
{"col_not_start": "Fulano"}
-
SQL result:
WHERE col NOT LIKE 'Fulano%'
-
-
-
Example:
{"col_end": "Fulano"}
-
SQL result:
WHERE col LIKE '%Fulano'
-
-
-
Example:
{"col_not_end": "Fulano"}
-
SQL result:
WHERE col NOT LIKE '%Fulano'
-
-
-
Example:
{"col_between": [10, 20]}
-
SQL result:
WHERE col BETWEEN 10 AND 20
-