PHP code example of shlinkio / doctrine-specification
1. Go to this page and download the library: Download shlinkio/doctrine-specification library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
shlinkio / doctrine-specification example snippets
// Not using the lib
$qb = $this->em->getRepository('HappyrRecruitmentBundle:Advert')
->createQueryBuilder('r');
return $qb->where('r.ended = 0')
->andWhere(
$qb->expr()->orX(
'r.endDate < :now',
$qb->expr()->andX(
'r.endDate IS NULL',
'r.startDate < :timeLimit'
)
)
)
->setParameter('now', new \DateTime())
->setParameter('timeLimit', new \DateTime('-4weeks'))
->getQuery()
->getResult();
// Using the lib
$spec = Spec::andX(
Spec::eq('ended', 0),
Spec::orX(
Spec::lt('endDate', new \DateTime()),
Spec::andX(
Spec::isNull('endDate'),
Spec::lt('startDate', new \DateTime('-4weeks'))
)
)
);
return $this->em->getRepository('HappyrRecruitmentBundle:Advert')->match($spec);
class AdvertsWeShouldClose extends BaseSpecification
{
public function getSpec()
{
return Spec::andX(
Spec::eq('ended', 0),
Spec::orX(
Spec::lt('endDate', new \DateTime()),
Spec::andX(
Spec::isNull('endDate'),
Spec::lt('startDate', new \DateTime('-4weeks'))
)
)
);
}
}
class OwnedByCompany extends BaseSpecification
{
private $companyId;
public function __construct(Company $company, ?string $context = null)
{
parent::__construct($context);
$this->companyId = $company->getId();
}
public function getSpec()
{
return Spec::andX(
Spec::join('company', 'c'),
Spec::eq('id', $this->companyId, 'c')
);
}
}
class SomeService
{
/**
* Fetch Adverts that we should close but only for a specific company
*/
public function myQuery(Company $company)
{
$spec = Spec::andX(
new AdvertsWeShouldClose(),
new OwnedByCompany($company)
);
return $this->em->getRepository('HappyrRecruitmentBundle:Advert')->match($spec);
}
}
class AdvertRepository extends EntityRepository
{
protected function filterAdvertsWeShouldClose(QueryBuilder $qb)
{
$qb
->andWhere('r.ended = 0')
->andWhere(
$qb->expr()->orX(
'r.endDate < :now',
$qb->expr()->andX('r.endDate IS NULL', 'r.startDate < :timeLimit')
)
)
->setParameter('now', new \DateTime())
->setParameter('timeLimit', new \DateTime('-4weeks'))
;
}
protected function filterOwnedByCompany(QueryBuilder $qb, Company $company)
{
$qb
->join('company', 'c')
->andWhere('c.id = :company_id')
->setParameter('company_id', $company->getId())
;
}
public function myQuery(Company $company)
{
$qb = $this->em->getRepository('HappyrRecruitmentBundle:Advert')->createQueryBuilder('r');
$this->filterAdvertsWeShouldClose($qb);
$this->filterOwnedByCompany($qb, $company);
return $qb->getQuery()->getResult();
}
}
$highRankFemalesSpec = Spec::andX(
Spec::eq('gender', 'F'),
Spec::gt('points', 9000)
);
// an array of arrays
$playersArr = [
['pseudo' => 'Joe', 'gender' => 'M', 'points' => 2500],
['pseudo' => 'Moe', 'gender' => 'M', 'points' => 1230],
['pseudo' => 'Alice', 'gender' => 'F', 'points' => 9001],
];
// or an array of objects
$playersObj = [
new Player('Joe', 'M', 40, 2500),
new Player('Moe', 'M', 55, 1230),
new Player('Alice', 'F', 27, 9001),
];
foreach ($playersArr as $playerArr) {
if ($highRankFemalesSpec->isSatisfiedBy($playerArr)) {
// do something
}
}
foreach ($playersObj as $playerObj) {
if ($highRankFemalesSpec->isSatisfiedBy($playerObj)) {
// do something
}
}
$highRankFemalesSpec = Spec::andX(
Spec::eq('gender', 'F'),
Spec::gt('points', 9000)
);
// an array of arrays
$playersArr = [
['pseudo' => 'Joe', 'gender' => 'M', 'points' => 2500],
['pseudo' => 'Moe', 'gender' => 'M', 'points' => 1230],
['pseudo' => 'Alice', 'gender' => 'F', 'points' => 9001],
];
// or an array of objects
$playersObj = [
new Player('Joe', 'M', 40, 2500),
new Player('Moe', 'M', 55, 1230),
new Player('Alice', 'F', 27, 9001),
];
$highRankFemales = $highRankFemalesSpec->filterCollection($playersArr);
$highRankFemales = $highRankFemalesSpec->filterCollection($playersObj);
$highRankFemales = $this->em->getRepository(Player::class)->match($highRankFemalesSpec);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.