public static getValueReferenceDetails ( string $reference ) : array | ||
$reference | string | |
return | array | The details has keys 'source-column', 'source-value', 'value-column' |
public static function getValueReferenceDetails($reference)
{
list($keyCol, $valueColumn) = explode("@", $reference);
list($sourceColumn, $sourceValue) = explode("=", $keyCol);
if (strpos($sourceValue, '[') !== false) {
list($sourceValue, $pathInStructure) = explode("[", $sourceValue, 2);
} else {
$pathInStructure = '';
}
return ['source-column' => $sourceColumn, 'source-value' => $sourceValue, 'value-column' => $valueColumn, 'path-in-structure' => $pathInStructure];
}
public function replaceForeignKeysWithReferences($entityName, $entity) { $entityInfo = $this->schemaInfo->getEntityInfo($entityName); $vpIdTable = $this->schemaInfo->getPrefixedTableName('vp_id'); foreach ($entityInfo->references as $referenceName => $targetEntity) { $targetTable = $this->schemaInfo->getEntityInfo($targetEntity)->tableName; if (isset($entity[$referenceName])) { if ($entity[$referenceName] > 0) { $referenceVpId = $this->database->get_var("SELECT HEX(vp_id) FROM {$vpIdTable} WHERE `table` = '{$targetTable}' AND id={$entity[$referenceName]}"); } else { $referenceVpId = 0; } $entity['vp_' . $referenceName] = $referenceVpId; unset($entity[$referenceName]); } } foreach ($entityInfo->valueReferences as $referenceName => $targetEntity) { list($sourceColumn, $sourceValue, $valueColumn) = array_values(ReferenceUtils::getValueReferenceDetails($referenceName)); if (isset($entity[$sourceColumn]) && $entity[$sourceColumn] == $sourceValue && isset($entity[$valueColumn])) { if ($entity[$valueColumn] == 0) { continue; } if ($targetEntity[0] === '@') { $entityNameProvider = substr($targetEntity, 1); $targetEntity = call_user_func($entityNameProvider, $entity); if (!$targetEntity) { continue; } } $targetTable = $this->schemaInfo->getEntityInfo($targetEntity)->tableName; $referenceVpId = $this->database->get_var("SELECT HEX(vp_id) FROM {$vpIdTable} WHERE `table` = '{$targetTable}' AND id=" . $entity[$valueColumn]); $entity[$valueColumn] = $referenceVpId; } } return $entity; }