/** * @param $entityName * @return mixed */ private function getEntitiesFromDatabase($entityName) { if ($this->dbSchema->isChildEntity($entityName)) { $entityInfo = $this->dbSchema->getEntityInfo($entityName); $parentReference = $entityInfo->parentReference; return $this->database->get_results("SELECT * FROM {$this->dbSchema->getPrefixedTableName($entityName)} ORDER BY {$parentReference}", ARRAY_A); } return $this->database->get_results("SELECT * FROM {$this->dbSchema->getPrefixedTableName($entityName)}", ARRAY_A); }
private function getIdsForVpIds($referencesToUpdate) { if (count($referencesToUpdate) === 0) { return [[0, 0]]; } $vpIds = array_map(function ($vpId) { return 'UNHEX("' . $vpId . '")'; }, $referencesToUpdate); $vpIdsRestriction = join(', ', $vpIds); $result = $this->database->get_results("SELECT HEX(vp_id), id FROM {$this->database->vp_id} WHERE vp_id IN ({$vpIdsRestriction})", ARRAY_N); $result[] = [0, 0]; return array_combine(array_column($result, 0), array_column($result, 1)); }
/** * Parses UPDATE query * * @param Parser $parser * @param DbSchemaInfo $schema * @param string $query * @param Database $database * @return ParsedQueryData */ private function parseUpdateQuery($parser, $query, $schema, $database) { /** @var UpdateStatement $sqlStatement */ $sqlStatement = $parser->statements[0]; $table = $sqlStatement->tables[0]->table; $idColumns = $this->resolveIdColumns($schema, $table); if ($idColumns == null) { return null; } $parsedQueryData = new ParsedQueryData(ParsedQueryData::UPDATE_QUERY); $parsedQueryData->table = $table; $parsedQueryData->idColumnsNames = $idColumns; $parsedQueryData->entityName = $this->resolveEntityName($schema, $table); $selectSql = $this->getSelectQuery($parser, $idColumns); $where = $this->getWhereFragments($parser, $query, $sqlStatement); if (isset($where)) { $selectSql .= " WHERE " . join(' ', $where); } $parsedQueryData->sqlQuery = $selectSql; $parsedQueryData->ids = $database->get_results($selectSql, ARRAY_N); $parsedQueryData->data = $this->getColumnDataToSet($sqlStatement); return $parsedQueryData; }
/** * Saves all already existing meta and M:N references for an entity that wasn't tracked yet * * @param array $data * @param string $entityName */ private function storeRelatedEntities($data, $entityName) { $id = $data[$this->dbSchemaInfo->getEntityInfo($entityName)->idColumnName]; foreach ($this->dbSchemaInfo->getAllEntityNames() as $referencedEntityName) { $entityInfo = $this->dbSchemaInfo->getEntityInfo($referencedEntityName); if ($this->dbSchemaInfo->isChildEntity($referencedEntityName) && $entityInfo->references[$entityInfo->parentReference] === $entityName) { $childEntities = $this->database->get_results("SELECT * FROM {$this->dbSchemaInfo->getPrefixedTableName($referencedEntityName)} WHERE `{$entityInfo->parentReference}` = '{$id}'", ARRAY_A); foreach ($childEntities as $childEntity) { $childEntity = $this->vpidRepository->replaceForeignKeysWithReferences($referencedEntityName, $childEntity); if (!$this->mirror->shouldBeSaved($referencedEntityName, $childEntity)) { continue; } $id = $childEntity[$entityInfo->idColumnName]; $vpid = $this->vpidRepository->getVpidForEntity($referencedEntityName, $id); if ($vpid) { $childEntity[$entityInfo->vpidColumnName] = $vpid; } else { $childEntity = $this->vpidRepository->identifyEntity($referencedEntityName, $childEntity, $childEntity[$entityInfo->idColumnName]); } $childEntity = $this->shortcodesReplacer->replaceShortcodesInEntity($referencedEntityName, $childEntity); $this->mirror->save($referencedEntityName, $childEntity); } } } foreach ($this->dbSchemaInfo->getAllMnReferences() as $mnReferenceDetails) { if ($mnReferenceDetails['source-entity'] === $entityName) { $junctionTable = $mnReferenceDetails['junction-table']; $prefixedJunctionTable = $this->dbSchemaInfo->getPrefixedTableName($junctionTable); $sourceColumn = $mnReferenceDetails['source-column']; $references = $this->database->get_results("SELECT * FROM `{$prefixedJunctionTable}` WHERE `{$sourceColumn}` = '{$id}'", ARRAY_A); foreach ($references as $reference) { $reference = $this->vpidRepository->replaceForeignKeysWithReferences($junctionTable, $reference); $this->mirror->save($junctionTable, $reference); } } } }