metadata = $metadata; } public function getRelationKeys(Entity $entity, string $relationName) : array { if (!$entity->hasRelation($relationName)) { throw new RuntimeException("Relation '{$relationName}' does not exist."); } $params = $entity->getRelations()[$relationName]; $type = $params['type'] ?? null; switch ($type) { case Entity::BELONGS_TO: $key = $params['key'] ?? ($relationName . 'Id'); $foreignKey = 'id'; if (isset($params['foreignKey'])){ $foreignKey = $params['foreignKey']; } return [ 'key' => $key, 'foreignKey' => $foreignKey, ]; case Entity::HAS_MANY: case Entity::HAS_ONE: $key = $params['key'] ?? 'id'; $foreign = $params['foreign'] ?? null; $foreignKey = $params['foreignKey'] ?? null; if (!$foreignKey && $foreign) { $foreignKey = $foreign . 'Id'; } if (!$foreignKey) { $foreignKey = lcfirst($entity->getEntityType()) . 'Id'; } return [ 'key' => $key, 'foreignKey' => $foreignKey, ]; case Entity::HAS_CHILDREN: $key = 'id'; if (isset($params['key'])){ $key = $params['key']; } $foreignKey = 'parentId'; if (isset($params['foreignKey'])) { $foreignKey = $params['foreignKey']; } $foreignType = 'parentType'; if (isset($params['foreignType'])) { $foreignType = $params['foreignType']; } return [ 'key' => $key, 'foreignKey' => $foreignKey, 'foreignType' => $foreignType, ]; case Entity::MANY_MANY: $key = 'id'; if (isset($params['key'])){ $key = $params['key']; } $foreignKey = 'id'; if (isset($params['foreignKey'])){ $foreignKey = $params['foreignKey']; } $nearKey = lcfirst($entity->getEntityType()) . 'Id'; $distantKey = lcfirst($params['entity']) . 'Id'; if (isset($params['midKeys']) && is_array($params['midKeys'])){ $nearKey = $params['midKeys'][0]; $distantKey = $params['midKeys'][1]; } return [ 'key' => $key, 'foreignKey' => $foreignKey, 'nearKey' => $nearKey, 'distantKey' => $distantKey, ]; case Entity::BELONGS_TO_PARENT: $key = $relationName . 'Id'; $typeKey = $relationName . 'Type'; return [ 'key' => $key, 'typeKey' => $typeKey, 'foreignKey' => 'id', ]; } throw new RuntimeException("Relation type '{$type}' not supported for 'getKeys'."); } }