/** * @param $xml * @param DbAdapter $db * @return Schema */ public static function fromXml($xml, DbAdapter $db) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); $name = $data['@attributes']['name']; $schema = new Schema($db); foreach ($data['tables']['table'] as $tableArray) { $table = Table::fromXml($tableArray, $schema); $schema->addTable($table); } foreach ($data['tables']['table'] as $tableArray) { $indexArrayList = is_int(key($tableArray['indexes']['index'])) ? $tableArray['indexes']['index'] : $tableArray['indexes']; $table = $schema->getTable($tableArray['@attributes']['name']); foreach ($indexArrayList as $indexArray) { $index = AbstractIndex::fromXml($indexArray, $table); $table->addIndex($index); } if (isset($tableArray['links']['link'])) { $linkArrayList = is_int(key($tableArray['links']['link'])) ? $tableArray['links']['link'] : $tableArray['links']; foreach ($linkArrayList as $linkArray) { $link = AbstractLink::fromXml($linkArray, $table); $table->addLink($link); } } } return $schema; }
/** * @param AbstractIndex $index * @return $this */ public function addIndex(AbstractIndex $index) { $this->_indexList[$index->getName()] = $index; /** * Колонке ставим флаг уникальности */ if (!$index->isMultiple() && $index->isUnique()) { $index->current()->setUniqueFlag(true); } return $this; }