phpdevcommunity / paper-orm
PaperORM is a lightweight Object-Relational Mapping (ORM) library
Requires
- php: >=7.4
- ext-ctype: *
- ext-json: *
- ext-pdo: *
- phpdevcommunity/michel-package-starter: ^1.0
- phpdevcommunity/php-console: ^1.0
- phpdevcommunity/php-filesystem: ^1.0
- phpdevcommunity/relational-query: ^1.0
Requires (Dev)
- phpdevcommunity/unitester: ^0.1.0@alpha
This package is auto-updated.
Last update: 2025-07-25 09:25:28 UTC
README
PaperORM is a PHP ORM designed for projects requiring a lightweight yet performant object-relational mapping solution.
đ Documentation
English
PaperORM is a PHP ORM designed for projects requiring a lightweight yet performant object-relational mapping solution. Specifically developed for PHP 7.4 and above, it positions itself as a lighter alternative to existing solutions.
At just 3MB compared to Doctrine's 75MB with dependencies, PaperORM offers the essential features of a modern ORM while maintaining a minimal footprint. It includes:
- Database schema management
- Migration system
- Repository pattern
Installation
PaperORM is available via Composer and installs in seconds.
đŠ Via Composer (recommended)
composer require phpdevcommunity/paper-orm:1.0.3-alpha
đ§ Minimal Configuration
Create a simple configuration file to connect PaperORM to your database:
<?php require_once 'vendor/autoload.php'; use PhpDevCommunity\PaperORM\EntityManager; // Basic configuration (MySQL, SQLite) $entityManager = new EntityManager([ 'driver' => 'sqlite', 'user' => null, 'password' => null, 'memory' => true, ]);
â PaperORM is now ready to use!
Note: PDO and corresponding database extensions must be enabled (pdo_mysql, pdo_sqlite, etc.).
Basic Usage
Note: The
repository
attribute/method is optional. If none is defined, a dummy repository will be automatically generated.
Defining an Entity
PHP 7.4 < 8
use PaperORM\Entity\EntityInterface; use PaperORM\Mapping\{PrimaryKeyColumn, StringColumn, BoolColumn, DateTimeColumn, OneToMany, JoinColumn}; class User implements EntityInterface { private ?int $id = null; private string $name; private string $email; private bool $isActive = true; private \DateTime $createdAt; public static function getTableName(): string { return 'users'; } public static function columnsMapping(): array { return [ (new PrimaryKeyColumn())->bindProperty('id'), (new StringColumn())->bindProperty('name'), (new StringColumn())->bindProperty('email'), (new BoolColumn('is_active'))->bindProperty('isActive'), // 'is_active' is the column name (new DateTimeColumn('created_at'))->bindProperty('createdAt') // 'created_at' is the column name ]; } // Getters/Setters... }
PHP 8+ with attributes
use PaperORM\Entity\EntityInterface; use PaperORM\Mapping\{PrimaryKeyColumn, StringColumn, BoolColumn, DateTimeColumn, OneToMany, JoinColumn}; #[Entity(table : 'user', repository : null)] class User implements EntityInterface { #[PrimaryKeyColumn] private ?int $id = null; #[StringColumn] private string $name; #[StringColumn] private string $email; #[BoolColumn(name: 'is_active')] private bool $isActive = true; #[DateTimeColumn(name: 'created_at')] private \DateTime $createdAt; // Getters/Setters... }
CRUD Operations
Fetching Entities:
// Get user by ID $user = $entityManager->getRepository(User::class)->find(1); // Filtered query $users = $entityManager->getRepository(User::class) ->findBy() ->where('isActive', true) ->orderBy('name', 'ASC') ->limit(10) ->toArray();
Insert/Update:
$newUser = new User(); $newUser->setName('Jean Dupont') ->setEmail('jean@example.com'); $entityManager->persist($newUser); $entityManager->flush();
Delete:
$user = $entityManager->getRepository(User::class)->find(1); $entityManager->remove($user); $entityManager->flush();
Entity Relationships
// OneToMany relationship class Article { // IF PHP >= 8 #[\PhpDevCommunity\PaperORM\Mapping\OneToMany(Comment::class, 'article')] private \PhpDevCommunity\PaperORM\Collection\ObjectStorage $comments; public function __construct() { $this->comments = new ObjectStorage(); } // ... public static function columnsMapping(): array { return [ new OneToMany('comments', Comment::class, 'article') ]; } } // Fetch with join $articleWithComments = $entityManager->getRepository(Article::class) ->find(1) ->with('comments') ->toObject();
Result Formats
// Associative array $userArray = $repository->find(1)->toArray(); // Entity object $userObject = $repository->find(1)->toObject(); // Object collection $activeUsers = $repository->findBy() ->where('isActive', true) ->toObject();
PaperORM offers a simple API while covering the essential needs of a modern ORM.
Beta Version - Contribute to Development
PaperORM is currently in beta version and actively evolving. We invite interested developers to:
đ Report Bugs
If you encounter issues, open a GitHub issue detailing:
- Context
- Reproduction steps
- Expected vs. actual behavior
đĄ Suggest Improvements
Ideas for:
- Performance optimization
- API improvements
- New features
đ Contribute to Documentation
Complete documentation is being written. You can:
- Fix errors
- Add examples
- Translate sections
Note: This version is stable for development use but requires additional testing for production.
Active development continues - stay tuned for updates!
Français
PaperORM est un ORM PHP conçu pour les projets qui nécessitent une solution de mapping objet-relationnel légÚre et performante. Développé spécifiquement pour PHP 7.4 et versions ultérieures, il se positionne comme une alternative plus légÚre aux solutions existantes.
Avec seulement 3Mo contre 75Mo pour Doctrine avec ses dépendances, PaperORM propose les fonctionnalités essentielles d'un ORM moderne tout en conservant une empreinte minimale. Il intÚgre notamment :
- La gestion des schémas de base de données
- Un systĂšme de migrations
- Le pattern Repository
Installation
PaperORM est disponible via Composer et s'installe en quelques secondes.
đŠ Via Composer (recommandĂ©)
composer require phpdevcommunity/paper-orm:1.0.3-alpha
đ§ Configuration minimale
Créez un fichier de configuration simple pour connecter PaperORM à votre base de données :
<?php require_once 'vendor/autoload.php'; use PhpDevCommunity\PaperORM\EntityManager; // Configuration de base (MySQL, SQLite) $entityManager = new EntityManager([ 'driver' => 'sqlite', 'user' => null, 'password' => null, 'memory' => true, ]);
â PaperORM est maintenant prĂȘt Ă ĂȘtre utilisĂ© !
Remarque : PDO et les extensions correspondantes Ă votre SGBD doivent ĂȘtre activĂ©es (pdo_mysql, pdo_sqlite, etc.).
Utilisation de base
Note: Lâattribut ou la mĂ©thode
repository
est facultatif. Si aucun nâest dĂ©fini, un repository fictif sera gĂ©nĂ©rĂ© automatiquement.
Définition d'une entité
PHP 7.4 < 8
use PaperORM\Entity\EntityInterface; use PaperORM\Mapping\{PrimaryKeyColumn, StringColumn, BoolColumn, DateTimeColumn, OneToMany, JoinColumn}; class User implements EntityInterface { private ?int $id = null; private string $name; private string $email; private bool $isActive = true; private \DateTime $createdAt; public static function getTableName(): string { return 'users'; } public static function columnsMapping(): array { return [ new PrimaryKeyColumn('id'), new StringColumn('name'), new StringColumn('email'), new BoolColumn('isActive'), new DateTimeColumn('createdAt') ]; } // Getters/Setters... }
PHP 8+ avec attributs
use PaperORM\Entity\EntityInterface; use PaperORM\Mapping\{PrimaryKeyColumn, StringColumn, BoolColumn, DateTimeColumn, OneToMany, JoinColumn}; #[Entity(table : 'user', repository : null)] class User implements EntityInterface { #[PrimaryKeyColumn] private ?int $id = null; #[StringColumn] private string $name; #[StringColumn] private string $email; #[BoolColumn(name: 'is_active')] private bool $isActive = true; #[DateTimeColumn(name: 'created_at')] private \DateTime $createdAt; // Getters/Setters... }
Opérations CRUD
Récupération d'entités :
// RĂ©cupĂ©rer un utilisateur par ID $user = $entityManager->getRepository(User::class)->find(1); // RequĂȘte avec filtres $users = $entityManager->getRepository(User::class) ->findBy() ->where('isActive', true) ->orderBy('name', 'ASC') ->limit(10) ->toArray();
Insertion/Mise Ă jour :
$newUser = new User(); $newUser->setName('Jean Dupont') ->setEmail('jean@example.com'); $entityManager->persist($newUser); $entityManager->flush();
Suppression :
$user = $entityManager->getRepository(User::class)->find(1); $entityManager->remove($user); $entityManager->flush();
Relations entre entités
// Relation OneToMany class Article { // IF PHP >= 8 #[\PhpDevCommunity\PaperORM\Mapping\OneToMany(Comment::class, 'article')] private \PhpDevCommunity\PaperORM\Collection\ObjectStorage $comments; public function __construct() { $this->comments = new ObjectStorage(); } // ... public static function columnsMapping(): array { return [ new OneToMany('comments', Comment::class, 'article') ]; } } // Récupération avec jointure $articleWithComments = $entityManager->getRepository(Article::class) ->find(1) ->with('comments') ->toObject();
Format des résultats
// Tableau associatif $userArray = $repository->find(1)->toArray(); // Objet entité $userObject = $repository->find(1)->toObject(); // Collection d'objets $activeUsers = $repository->findBy() ->where('isActive', true) ->toCollection();
PaperORM propose une API simple tout en couvrant les besoins essentiels d'un ORM moderne.
Version BĂȘta - Contribuez au dĂ©veloppement
PaperORM est actuellement en version bĂȘta et Ă©volue activement. Nous invitons tous les dĂ©veloppeurs intĂ©ressĂ©s Ă :
đ Signaler des bugs
Si vous rencontrez un problÚme, ouvrez une issue GitHub en détaillant :
- Le contexte
- Les étapes pour reproduire
- Le comportement attendu vs. observé
đĄ Proposer des amĂ©liorations
Des idées pour :
- Optimiser les performances
- Améliorer l'API
- Ajouter des fonctionnalités
đ Contribuer Ă la documentation
La documentation complÚte est en cours de rédaction. Vous pouvez :
- Corriger des erreurs
- Ajouter des exemples
- Traduire des sections
Note : Cette version est stable pour un usage en développement, mais nécessite des tests supplémentaires pour la production.
Le développement actif continue - restez à l'écoute pour les mises à jour !