PHPackages                             precision-soft/doctrine-utility - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. precision-soft/doctrine-utility

ActiveLibrary[Database &amp; ORM](/categories/database)

precision-soft/doctrine-utility
===============================

doctrine utilities library

v3.2.5(1mo ago)06.0k↓50%MITPHPPHP &gt;=8.2

Since Sep 17Pushed 2mo agoCompare

[ Source](https://github.com/precision-soft/doctrine-utility)[ Packagist](https://packagist.org/packages/precision-soft/doctrine-utility)[ Docs](https://github.com/precision-soft/doctrine-utility)[ RSS](/packages/precision-soft-doctrine-utility/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (12)Versions (13)Used By (0)

Doctrine utility library
========================

[](#doctrine-utility-library)

Doctrine custom types and functions.

**You may fork and modify it as you wish**.

Any suggestions are welcomed.

Usage for \\PrecisionSoft\\Doctrine\\Utility\\Repository\\AbstractRepository and \\PrecisionSoft\\Doctrine\\Utility\\Repository\\DoctrineRepository
---------------------------------------------------------------------------------------------------------------------------------------------------

[](#usage-for-precisionsoftdoctrineutilityrepositoryabstractrepository-and-precisionsoftdoctrineutilityrepositorydoctrinerepository)

The purposes for this classes are:

- Easier constructor injection for the "repositories". The quotes are because these repositories are actual **read services** (in CRUD methodology).
- Code reuse by using custom filters and join "filters".
- Better find usages for methods because you are forced to implement only what you need.

**Product.php**

```
namespace Acme\Domain\Product\Entity;

use Doctrine\ORM\Mapping as ORM;
use PrecisionSoft\Doctrine\Utility\Entity\CreatedTrait;
use PrecisionSoft\Doctrine\Utility\Entity\ModifiedTrait;
use PrecisionSoft\Doctrine\Utility\Repository\DoctrineRepository;

/**
 * @ORM\Entity(repositoryClass=DoctrineRepository::class)
 * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
 * @ORM\Table(options={"collate":"utf8mb4_general_ci"})
 * )
 */
class Product
{
    use CreatedTrait;
    use ModifiedTrait;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private ?int $id;

    /**
     * @ORM\Column(type="string", length=64, nullable=false, unique=true)
     */
    private string $barcode;

    /**
     * @ORM\ManyToOne(targetEntity=ProductType::class, fetch="EXTRA_LAZY")
     * @ORM\JoinColumn(nullable=false, onDelete="RESTRICT")
     */
    private ProductType $productType;
}
```

**ProductRepository.php**

```
namespace Acme\Domain\Product\Repository;

use Acme\Domain\Product\Entity\Product;
use Acme\Domain\Product\Exception\Exception;
use Acme\Domain\Product\Exception\NotFoundException;
use Acme\Domain\Product\Repository\ProductTypeRepository;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use PrecisionSoft\Doctrine\Utility\Join\JoinCollection;
use PrecisionSoft\Doctrine\Utility\Repository\AbstractRepository;

class ProductRepository extends AbstractRepository
{
    public const JOIN_PRODUCT_TYPE = 'joinProductType';

    public static function getEntityClass(): string
    {
        return Product::class;
    }

    public function find(int $productId): Product
    {
        /** @var Product $product */
        $product = $this->getDoctrineRepository()->find($productId);

        if (!$product) {
            throw new NotFoundException('The product was not found');
        }

        return $product;
    }

    protected function attachCustomFilters(QueryBuilder $qb, array $filters): JoinCollection
    {
        $joins = new JoinCollection();

        foreach ($filters as $key => $value) {
            switch ($key) {
                case 'barcodeLike':
                    $baseKey = \substr($key, 0, -4);

                    $qb->andWhere(static::getAlias() . ".{$baseKey} LIKE :{$key}")
                        ->setParameter($key, $value);
                    break;
                case static::JOIN_PRODUCT_TYPE:
                    $joins->addJoin(
                        new Join(
                            $value,
                            static::getAlias() . '.productType',
                            ProductTypeRepository::getAlias()
                        )
                    );
                default:
                    throw new Exception(\sprintf('Invalid filter `%s` for `%s::%s`', $key, static::class, __FUNCTION__));
            }
        }

        return $joins;
    }
}
```

Todo
----

[](#todo)

- Unit tests.

Dev
---

[](#dev)

```
git clone git@gitlab.com:precision-soft-open-source/doctrine/utility.git
cd utility

./dc build && ./dc up -d
```

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance94

Actively maintained with recent releases

Popularity23

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~50 days

Recently: every ~0 days

Total

12

Last Release

49d ago

Major Versions

v1.0.0 → v2.0.02024-10-17

v2.0.1 → v3.0.02025-02-27

### Community

Maintainers

![](https://www.gravatar.com/avatar/dc22fddecbd2128c6ed8b90f69c5a5bc1445f3e42ea1845b03c0f26a955ae307?d=identicon)[adrian.jeledintan](/maintainers/adrian.jeledintan)

---

Tags

doctrinerepository

###  Code Quality

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/precision-soft-doctrine-utility/health.svg)

```
[![Health](https://phpackages.com/badges/precision-soft-doctrine-utility/health.svg)](https://phpackages.com/packages/precision-soft-doctrine-utility)
```

###  Alternatives

[laravel-doctrine/orm

An integration library for Laravel and Doctrine ORM

8425.3M86](/packages/laravel-doctrine-orm)[scienta/doctrine-json-functions

A set of extensions to Doctrine that add support for json query functions.

58523.9M35](/packages/scienta-doctrine-json-functions)[knplabs/doctrine-behaviors

Doctrine Behavior Traits

92212.7M64](/packages/knplabs-doctrine-behaviors)[damienharper/auditor-bundle

Integrate auditor library in your Symfony projects.

4542.8M](/packages/damienharper-auditor-bundle)[sonata-project/doctrine-orm-admin-bundle

Integrate Doctrine ORM into the SonataAdminBundle

46117.7M154](/packages/sonata-project-doctrine-orm-admin-bundle)[sonata-project/entity-audit-bundle

Audit for Doctrine Entities

644989.8k1](/packages/sonata-project-entity-audit-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
