/** * @param $xml * @param Schema $schema * @return Table */ public static function fromXml($xml, Schema $schema) { 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']; $table = new Table($name, $schema); $columns = is_int(key($data['columns']['column'])) ? $data['columns']['column'] : $data['columns']; if (is_array($columns)) { foreach ($columns as $col) { $column = Column::fromXml($col, $table); $table->addColumn($column); } } /*if (isset($data['links']['link']) && is_array($data['links']['link'])) { foreach ($data['links']['link'] as $linkArray) { $link = AbstractLink::fromXml($linkArray, $table); $table->addLink($link); } } if (isset($data['indexes']['index']) && is_array($data['indexes']['index'])) { foreach ($data['indexes']['index'] as $indexArray) { $index = AbstractIndex::fromXml($indexArray, $table); $table->addIndex($index); } }*/ return $table; }
/** * @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; }
/** * Создать экземпляр из XMl * * @param $xml * @param \Model\Cluster\Schema\Table $table * @throws \Model\Exception\ErrorException * @return AbstractLink */ public static function fromXml($xml, Table $table) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); switch (strtolower($data['type'])) { case 'onetoone': $type = self::LINK_TYPE_ONE_TO_ONE; break; case 'onetomany': $type = self::LINK_TYPE_ONE_TO_MANY; break; case 'manytoone': $type = self::LINK_TYPE_MANY_TO_ONE; break; case 'manytomany': $type = self::LINK_TYPE_MANY_TO_MANY; break; } $type = '\\' . $type; $schema = $table->getSchema(); $localColumn = $schema->getTable($data['local_table'])->getColumn($data['local_column']); $foreignColumn = $schema->getTable($data['foreign_table'])->getColumn($data['foreign_column']); if (!$localColumn) { throw new ErrorException('Local column not found'); } if (!$foreignColumn) { throw new ErrorException('Foreign column not found'); } if (isset($data['rule_update'])) { if (empty($data['rule_update'])) { $data['rule_update'] = null; } } if (isset($data['rule_delete'])) { if (empty($data['rule_delete'])) { $data['rule_delete'] = null; } } if (isset($data['link_table'])) { $linkTableLocalColumn = $schema->getTable($data['link_table'])->getColumn($data['link_table_local_column']); $linkTableForeignColumn = $schema->getTable($data['link_table'])->getColumn($data['link_table_foreign_column']); if (!$linkTableLocalColumn) { throw new ErrorException('Link table Local column not found'); } if (!$linkTableForeignColumn) { throw new ErrorException('Link table Foreign column not found'); } $link = new $type($localColumn, $foreignColumn, $data['rule_delete'], $data['rule_update'], $linkTableLocalColumn, $linkTableForeignColumn); } else { $link = new $type($localColumn, $foreignColumn, $data['rule_delete'], $data['rule_update']); } return $link; }
/** * @param $xml * @param \Model\Cluster\Schema\Table $table * @return mixed * @throws \Model\Exception\ErrorException */ public static function fromXml($xml, Table $table) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); $columnArray = array_map('trim', explode(',', $data['@attributes']['columns'])); $columns = array(); foreach ($columnArray as $column) { $col = $table->getColumn($column); if (!$col) { throw new \Model\Exception\ErrorException('Column ' . $column . ' not found'); } $columns[] = $col; } switch (strtolower($data['@attributes']['type'])) { case 'primary': $type = self::TYPE_PRIMARY; break; case 'unique': $type = self::TYPE_UNIQUE; break; case 'key': $type = self::TYPE_KEY; break; } return new $type($data['@attributes']['name'], $columns); }