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.
];
}
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());
}
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)