d2d.emegrendeles.hu/app/Traits/GetRelationshipsTraits.php
E98Developer 68b7c35bef git init
2026-02-28 06:53:05 +01:00

136 lines
3.7 KiB
PHP

<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Relations\Relation;
use ReflectionClass;
use ReflectionMethod;
trait GetRelationshipsTraits
{
/**
* Auditable boot logic.
*/
public static function bootGetRelationshipsTraits(): void
{
static::setAvailableRelations();
}
protected static $excludedTraitFromReflect = [
__TRAIT__,
'OwenIt\Auditing\Auditable',
];
protected static $excludeTraitMethodeFromGetRelationships = [];
public static function getRelationships(): array
{
$model = new static;
$relationships = [];
$excludedMethods = [
'getRelationships',
'getRelationshipsNames',
'setAvailableRelations',
'resolveUser',
'resolveUrl',
'resolveIpAddress',
'resolveUserAgent',
'toAudit',
'transformAudit',
'modifyAttributeValue',
'readyForAuditing',
'getAuditEvents',
'getAuditInclude',
'getAuditExclude',
'getAuditStrict',
'getAuditTimestamps',
'getAuditDriver',
'getAuditThreshold',
'getAttributeModifiers',
'generateTags',
'transitionTo',
];
foreach ((new ReflectionClass($model))->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
if ($method->class != get_class($model) ||
! empty($method->getParameters()) ||
in_array($method->getName(), $excludedMethods) ||
str_starts_with($method->getName(), 'boot')
) {
continue;
}
try {
$return = $method->invoke($model);
if ($return instanceof Relation) {
$relationships[$method->getName()] = [
'type' => (new ReflectionClass($return))->getShortName(),
'model' => (new ReflectionClass($return->getRelated()))->getName(),
];
}
} catch (\Throwable $e) {
}
}
return $relationships;
}
/**
* Available relationships for the model.
*
* @var array
*/
public static $availableRelations = [];
public static function getRelationshipsNames($needInitialize = false, $outputFormat = 'camelCase'): array
{
if ($needInitialize) {
self::setAvailableRelations();
}
$ret = array_keys(self::$availableRelations);
switch ($outputFormat) {
case 'camelCase':
$ret = array_map(function ($val) {
return lcfirst($val);
}, $ret);
break;
case 'snakeCase':
case 'snake_case':
$ret = array_map(function ($val) {
return strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $val));
}, $ret);
break;
case 'pascalCase':
case 'PascalCase':
// do nothing
break;
case 'kebabCase':
case 'kebab-case':
$ret = array_map(function ($val) {
return strtolower(preg_replace('/(?<!^)[A-Z]/', '-$0', $val));
}, $ret);
break;
default:
break;
}
return $ret;
}
/**
* Stores relationships for future use
*/
public static function setAvailableRelations(?array $relations = null): array
{
if (! $relations) {
$relations = self::getRelationships();
}
self::$availableRelations = $relations;
return $relations;
}
}