/**
* Fixes value references
*
* @param $entity
*/
private function fixValueReferencesOfOneEntity($entity)
{
$entityInfo = $this->dbSchema->getEntityInfo($this->entityName);
$references = $entityInfo->valueReferences;
$referencesToUpdate = array();
foreach ($references as $reference => $referencedEntity) {
list($sourceColumn, $sourceValue, $valueColumn) = array_values(ReferenceUtils::getValueReferenceDetails($reference));
if (isset($entity[$sourceColumn]) && $entity[$sourceColumn] == $sourceValue && isset($entity[$valueColumn])) {
$referencesToUpdate[$valueColumn] = $entity[$valueColumn];
}
}
if (count($referencesToUpdate) === 0) {
return;
}
$idMap = $this->getIdsForVpIds($referencesToUpdate);
$entityTable = $this->dbSchema->getPrefixedTableName($this->entityName);
$vpIdTable = $this->dbSchema->getPrefixedTableName('vp_id');
$idColumnName = $entityInfo->idColumnName;
$updateSql = "UPDATE {$entityTable} SET ";
$newReferences = array_map(function ($vpId) use($idMap) {
return $idMap[$vpId];
}, $referencesToUpdate);
$updateSql .= join(", ", ArrayUtils::parametrize($newReferences));
$updateSql .= " WHERE {$idColumnName}=(SELECT id FROM {$vpIdTable} WHERE vp_id=UNHEX(\"{$entity['vp_id']}\"))";
$this->database->query($updateSql);
}