doctrine-ransack
Installation
$ composer require paliari/doctrine-ransack
Configuration
Your setup, example, (*1)
<?php
use Paliari\Doctrine\Ransack;
use Paliari\Doctrine\RansackConfig;
$ransack = new Ransack(new RansackConfig($entityManager));
Usage
<?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();
Custom Association
Your class of get custom association, (*2)
<?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, (*3)
<?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();
Filters
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., (*4)
It is also possible to combine predicates within or or and clauses, eg:, (*5)
$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',
],
],
];
List of all possible predicates
-
*_eq (equal)
-
*_not_eq (not equal)
-
*_in (match any values in array)
-
Example:, (*10)
{"col_in": [13, 21, 124, 525]}
-
SQL result:, (*11)
WHERE col IN (13, 21, 124, 525)
-
*_not_in (match none of values in array)
-
Example:, (*12)
{"col_not_in": [13, 21, 124, 525]}
-
SQL result:, (*13)
WHERE col NOT IN (13, 21, 124, 525)
-
*_null (is null)
-
Example:, (*14)
{"col_null": null}
-
SQL result:, (*15)
WHERE col IS NULL
-
*_not_null (is not null)
-
Example:, (*16)
{"col_not_null": null}
-
SQL result:, (*17)
WHERE col IS NOT NULL
-
*_present (not null and not empty)
Only compatible with string columns., (*18)
-
*_blank (is null or empty)
Only compatible with string columns., (*21)
-
*_lt (less than)
-
Example:, (*24)
{"col_lt": 25}
-
SQL result:, (*25)
WHERE col < 25
-
*_lteq (less than or equal to)
-
Example:, (*26)
{"col_lteq": 25}
-
SQL result:, (*27)
WHERE col <= 25
-
*_gt (greater than)
-
Example:, (*28)
{"col_gt": 25}
-
SQL result:, (*29)
WHERE col > 25
-
*_gteq (greater than or equal to)
-
Example:, (*30)
{"col_gteq": 25}
-
SQL result:, (*31)
WHERE col >= 25
-
*_matches (matches with LIKE)
-
*_not_matches (does not match with LIKE)
-
*_cont (contains value)
-
*_not_cont (does not contain)
-
*_start (starts with)
-
Example:, (*40)
{"col_start": "Fulano"}
-
SQL result:, (*41)
WHERE col LIKE 'Fulano%'
-
*_not_start (does not start with)
-
*_end (ends with)
-
Example:, (*44)
{"col_end": "Fulano"}
-
SQL result:, (*45)
WHERE col LIKE '%Fulano'
-
*_not_end (does not end with)
-
*_between (between in 2 values)
Authors