/** * @param string $columnName * @param array $joinIds */ protected function addColumnAliasesForVirtualRelation($columnName, array $joinIds) { if (!empty($this->virtualColumnExpressions[$columnName])) { return; } if (!$this->virtualRelationsJoins) { return; } $hasVirtualRelation = false; foreach ($joinIds as $columnJoinId) { $hasVirtualRelation = $hasVirtualRelation || array_search($columnJoinId, $this->virtualRelationsJoins); } if (!$hasVirtualRelation) { return; } $parentJoinId = $this->getParentJoinIdentifier($this->joinIdHelper->buildColumnJoinIdentifier($columnName)); $fieldName = $this->getFieldName($parentJoinId); $className = $this->getEntityClassName($parentJoinId); if ($this->virtualRelationProvider->isVirtualRelation($className, $fieldName)) { $tableAlias = $this->aliases[$this->virtualRelationProvider->getTargetJoinAlias($className, $fieldName, $this->getFieldName($columnName))]; } else { $joinId = end($joinIds); $tableAlias = $this->tableAliases[$joinId]; } $this->virtualColumnExpressions[$columnName] = sprintf('%s.%s', $tableAlias, $this->getFieldName($columnName)); }
/** * @param array $expected * * @dataProvider getFieldsWithVirtualRelationsAndEnumsDataProvider */ public function testGetFieldsWithVirtualRelationsAndEnums(array $expected) { $className = 'Acme\\Entity\\Test'; $config = [$className => ['config' => ['label' => 'Test Label', 'plural_label' => 'Test Plural Label', 'icon' => 'icon-test'], 'fields' => ['field1' => ['type' => 'integer', 'identifier' => true, 'config' => ['label' => 'Field 1']]], 'relations' => ['rel1' => ['target_class' => 'Acme\\EnumValue1', 'type' => 'ref-one', 'config' => ['label' => 'Enum Field']], 'rel2' => ['target_class' => 'Acme\\EnumValue2', 'type' => 'ref-many', 'config' => ['label' => 'Multi Enum Field']]]]]; $this->prepare($config); $this->virtualFieldProvider->expects($this->once())->method('getVirtualFields')->with($className)->will($this->returnValue(['rel1', 'rel2'])); $this->virtualRelationProvider->expects($this->once())->method('getVirtualRelations')->with($className)->will($this->returnValue(['virtual_relation' => ['relation_type' => 'oneToMany', 'related_entity_name' => 'OtherEntity', 'query' => ['select' => ['select expression'], 'join' => ['join expression']]]])); $this->virtualFieldProvider->expects($this->exactly(2))->method('getVirtualFieldQuery')->will($this->returnValueMap([[$className, 'rel1', ['select' => ['return_type' => 'enum', 'filter_by_id' => true]]], [$className, 'rel2', ['select' => ['return_type' => 'multiEnum', 'filter_by_id' => true]]]])); $result = $this->provider->getFields('Acme:Test', true, true); $this->assertEquals($expected, $result); }
/** * Adds entity virtual fields to $result * * @param array $result * @param string $className * @param bool $withEntityDetails * @param bool $applyExclusions * @param bool $translate */ protected function addVirtualRelations(array &$result, $className, $withEntityDetails, $applyExclusions, $translate) { if (!$this->virtualRelationProvider) { return; } $metadata = $this->getMetadataFor($className); $virtualRelations = $this->virtualRelationProvider->getVirtualRelations($className); foreach ($virtualRelations as $associationName => $virtualRelation) { if ($applyExclusions && $this->exclusionProvider->isIgnoredField($metadata, $associationName)) { continue; } $fieldType = $virtualRelation['relation_type']; $targetClassName = $this->entityClassResolver->getEntityClass($virtualRelation['related_entity_name']); $label = !empty($virtualRelation['label']) ? $virtualRelation['label'] : $this->getFieldLabel($metadata, $associationName); $this->addRelation($result, $associationName, $fieldType, $label, $this->getRelationType($fieldType), $targetClassName, $withEntityDetails, $translate); } }
protected function loadVirtualFields() { $entities = $this->cache->getEntities(); foreach ($entities as $className => $entityData) { $virtualFields = $this->virtualFieldProvider->getVirtualFields($className); if (!empty($virtualFields)) { foreach ($virtualFields as $fieldName) { if (null === $this->cache->getConfigurable($className, $fieldName)) { $this->cache->saveConfigurable(false, $className, $fieldName); } } } $virtualRelations = $this->virtualRelationProvider->getVirtualRelations($className); if (!empty($virtualRelations)) { foreach ($virtualRelations as $fieldName => $config) { if (null === $this->cache->getConfigurable($className, $fieldName)) { $this->cache->saveConfigurable(false, $className, $fieldName); } } } } }