Retrieve an aggregate¶
Once an aggregate has been persisted you'll want to load it at some point.
The easiest way to retrieve it is to load all aggregates and filter the one you want:
$alice = $orm
->repository(User::class)
->all()
->find(static fn(User $user) => $user->name() === 'alice')
->match(
static fn(User $user) => $user,
static fn() => null,
);
If there's an alice
user in the storage then $alice
will be an instance of User
otherwise it will be null
.
Note
Note that you don't need to be in a transaction to fetch your aggregates.
While this example is simple enough it's not very performant as it loads every aggregate from the storage until it finds alice. The better approach is to directly fetch alice via its id:
$alice = $orm
->repository(User::class)
->get(Id::of(User::class, 'alice-uuid'))
->match(
static fn(User $user) => $user,
static fn() => null,
);
Here we use alice-uuid
as the id value but this is a placeholder. You should replace it with the real id value, usually it will come from a HTTP route parameter.
Info
An Id
can be transformed to a string via the $id->toString()
method.
The get
method returns a Maybe<User>
as the corresponding user may not exist in the storage. Here we return null
if alice doesn't exist but you can return or call any code you'd like.
Note
If you want to learn how to retrieve mutliple aggregates corresponding to a set of criteria head to the Specification chapter.
Note
Note that the monads are lazy evaluated when retrieving data. This means that it will hit the storage only when trying to extract data from them and will only load one aggregate at a time.
For a Maybe
this means calling match
or memoize
. For a Sequence
it's all methods marked with in its documentation.