This ORM1 focuses to simplify data manipulation.
This is achieved by:
- using immutable objects
- each aggregate owning the objects it references
- using monads to fetch aggregates (from the Innmind ecosystem)
- using the specification pattern to match aggregates
This allows:
- simpler app design (as it can be pure)
- memory efficiency (the ORM doesn't keep objects in memory)
- long living processes (since there is no memory leaks)
- to work asynchronously
composer require formal/orm
use Formal\ORM\{
Manager,
Sort,
};
use Formal\AccessLayer\Connection\PDO;
use Innmind\Url\Url;
$manager = Manager::sql(
PDO::of(Url::of('mysql://user:pwd@host:3306/database?charset=utf8mb4')),
);
$_ = $manager
->repository(YourAggregate::class)
->all()
->sort('someProperty', Sort::asc)
->drop(150)
->take(50)
->foreach(static fn($aggregate) => doStuff($aggregate));
This simple example will retrieve from the database 50
elements (from index 151
to 200
) sorted by someProperty
in ascending order and will call the function doStuff
on each aggregate.
Note
The elements are streamed meaning only one aggregate is in memory at a time allowing you to deal with long lists of elements in a memory safe way.
Full documentation available in the here.
Footnotes
-
Object Relational Mapping ↩