/** * 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); }