solophp / base-repository
Base repository pattern implementation for PHP applications
v3.1.0
2026-06-04 08:38 UTC
Requires
- php: ^8.3
- doctrine/dbal: ^4.3
Requires (Dev)
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^12.0
- squizlabs/php_codesniffer: ^3.13
README
Lightweight PHP repository pattern with built-in soft delete, eager loading, and rich criteria syntax.
Features
- Soft delete with restore/force delete
- Eager loading (BelongsTo, HasOne, HasMany, BelongsToMany)
- Rich criteria syntax: operators, BETWEEN, OR/AND groups, and correlated EXISTS via relation dot-notation
- Built-in aggregations (count, sum, avg, min, max)
- Translation via
withLocale()— auto LEFT JOIN, propagates into relation EXISTS - Transaction helpers with row locking (
SELECT ... FOR UPDATE) and cross-process advisory locks (withLock()) for idempotency - Custom IDs (UUID, ULID, prefixed) via
$autoIncrement = false
Installation
composer require solophp/base-repository
Requirements: PHP 8.3+, Doctrine DBAL ^4.3
Database: any Doctrine DBAL platform. Locking is platform-specific:
lockForUpdate() — MySQL/MariaDB, PostgreSQL, Oracle; withLock() advisory locking —
MySQL/MariaDB (GET_LOCK) and PostgreSQL (pg_advisory_lock). Other platforms throw on these calls.
Quick Example
class UserRepository extends BaseRepository { protected ?string $deletedAtColumn = 'deleted_at'; public function __construct(Connection $connection) { parent::__construct($connection, User::class, 'users'); } } // Usage $users = $repo->findBy(['status' => 'active'], ['created_at' => 'DESC'], 20, 1); $repo->delete($id); // Soft delete $repo->restore($id); // Restore
Documentation
License
MIT