DEV Community

marius-ciclistu
marius-ciclistu

Posted on • Originally published at marius-ciclistu.Medium on

Segregated Relations Maravel-Framework 10.65


Maravel-Framework

Version 10.65.0 of Maravel-Framework is out.

Now you can define your relations like this, in one place in your model:

// model
    protected function segregatedRelationsDefinitionMap(): array
    {
       return [
           'relName' => fn(): HasOne => $this->hasOne(Model::class, 'model_id', 'id'),
           // Reuse the segregatedrelation inside another segregated relation:
           'relNameScoped' => fn(): HasOne => $this->relName()->where('col', '=', 'text'),
           'relNameScoped2' => fn(): HasOne => $this->callSegregatedRelation('relName')->where('col', '=', 'text'),
           // Reuse the method relation:
           'relNameAsMethod' => $this->relNameAsMethod(...),
           'relNameAsMethod' => fn(): HasOne => $this->relNameAsMethod(),
           // AVOID THIS BECAUSE IT IS NOT Closure and it will not work:
           'relNameAsMethod' => [$this, 'relNameAsMethod'],
           // AVOID THIS
           'relNameAsMethod' => fn(): HasOne => [$this, 'relNameAsMethod'](),
           // DO NOT USE IT LIKE THIS!:
           'relNameAsMethod' => fn(): HasOne => $this->relNameAsMethod(...)(), // executes the relation inside the map.
       ];
    }
Enter fullscreen mode Exit fullscreen mode

And get the whole list by calling segregatedRelationList :

/**
 * Get the list of all currently identified relationship keys.
 *
 * This list includes:
 * 1. Explicitly defined relations from
 * @see segregatedRelationsDefinitionMap()
 * 2. Implicit method-based relations that have been "promoted" to the global
 * static map via @see resolveSegregatedRelationClosure()
 *
 * @param bool $discoverMethods If true, performs a one-time SLOW REFLECTION scan to identify and
 * promote all typed relationship methods to the global map.
 *
 * @note This list is usage-dependent when $discoverMethods is false. If true, the static
 * map is force-populated for the remainder of the request lifecycle.
 * THE FASTEST WAY for execution is to refactor all method relations by moving them into that map or
 * manually promote all method relations to segregated relations via:
 * @see segregatedRelationsDefinitionMap()
 * return [
 * 'relNameAsMethod' => $this->relNameAsMethod(...)
 * ]
 *
 * @return string[]
 */
final public function segregatedRelationList(bool $discoverMethods = false): array
{
    if ($discoverMethods) {
        $this->promoteMethodRelationsToSegregatedRelations();
    }

    return \array_keys($this->thisSegregatedRelationDefinitionMap());
}
Enter fullscreen mode Exit fullscreen mode

See more details in this article.

I am expecting a small increase in execution speed with this change because of how isRelation method was refactored.

The documentation was updated.

Top comments (0)