/** * (non-PHPdoc) * @see \ZfcDB\Mapper\MapperInterface::save() */ public function save($object) { $metadata = new Metadata($this->getDbAdapter()); $constraints = $metadata->getConstraints($this->tableName); $datas = $object; if (!is_array($datas)) { $datas = $this->getHydrator()->extract($object); } $primaries = array(); if (count($constraints)) { foreach ($constraints as $constraint) { if ($constraint->getType() == "PRIMARY KEY") { $primaries = $constraint->getColumns(); } } } $edit = true; if (count($primaries)) { foreach ($primaries as $primarie) { if (empty($datas[$primarie])) { $edit = false; break; } } } $this->getEventManager()->trigger(__FUNCTION__, $this, array('entity' => $object)); if ($edit) { $this->update($datas, array_intersect_key($datas, array_flip($primaries))); } else { $this->insert($datas); } $this->getEventManager()->trigger(__FUNCTION__ . '.post', $this, array('entity' => $object)); return $this; }
/** * Função que pega a coluna de PK * @param string $table * @param string $schema * @return string */ public function getPrimaryColumn($table, $schema) { $metadata = new zendMetadata($this->getAdapter($this->varConfigAdapter)); $tableColumns = $metadata->getConstraints($table, $schema); $returnPrimaryColumn = null; foreach ($tableColumns as $value) { if ($value->getType() == 'PRIMARY KEY') { $arrayColumns = $value->getColumns(); $returnPrimaryColumn = $arrayColumns[0]; } } return $returnPrimaryColumn; }
/** * Função que gera um print dos metadados */ public function getPrintMetadata() { $metadata = new Metadata($this->getDbAdapter()); foreach ($metadata->getSchemas() as $valueSchema) { echo 'In Schema ' . $valueSchema . PHP_EOL; // get the table names $tableNames = $metadata->getTableNames($valueSchema); foreach ($tableNames as $tableName) { echo 'In Table ' . $tableName . PHP_EOL; $table = $metadata->getTable($tableName, $valueSchema); echo ' With columns: ' . PHP_EOL; foreach ($table->getColumns() as $column) { echo ' ' . $column->getName() . ' -> ' . $column->getDataType() . PHP_EOL; } echo PHP_EOL; echo ' With constraints: ' . PHP_EOL; foreach ($metadata->getConstraints($tableName, $valueSchema) as $constraint) { /** @var $constraint Zend\Db\Metadata\Object\ConstraintObject */ echo ' ' . $constraint->getName() . ' -> ' . $constraint->getType() . PHP_EOL; if (!$constraint->hasColumns()) { continue; } echo ' column: ' . implode(', ', $constraint->getColumns()); if ($constraint->isForeignKey()) { $fkCols = array(); foreach ($constraint->getReferencedColumns() as $refColumn) { $fkCols[] = $constraint->getReferencedTableName() . '.' . $refColumn; } echo ' => ' . implode(', ', $fkCols); } echo PHP_EOL; } echo '----' . PHP_EOL; } echo '-------------------------------------------' . PHP_EOL; } }
/** * @param Metadata $metadata * @param $tableName * @param $columnName * @return null|\Zend\Db\Metadata\Object\ConstraintObject */ protected function getConstraintForColumn(Metadata $metadata, $tableName, $columnName) { /** @var \Zend\Db\Metadata\Object\ConstraintObject $constraint */ foreach ($metadata->getConstraints($tableName) as $constraint) { foreach ($constraint->getColumns() as $column) { if ($column == $columnName) { return $constraint; } } } return null; }
/** * createColumn * * FIXME: requried quoted queries data * * @param string $table * @param string $column * @param string $datatype * @param string $length * @param string $default * @param bool $notnull * @param bool $primary * @return bool */ public function createColumn($table, $column, $datatype, $length = null, $default = null, $notnull = false, $primary = false) { // alter table $table add column $column $options // alter table `p_zfc`.`asd` add column `name` varchar(123) NOT NULL after `id` $column = $this->getDbAdapter()->getPlatform()->quoteIdentifier($column); $query = 'ALTER TABLE ' . $this->getDbAdapter()->getPlatform()->quoteIdentifier($table) . ' ADD COLUMN ' . $column; // switch statement for $datatype switch ($datatype) { case AbstractMigration::TYPE_VARCHAR: $length = $length ? $length : 255; $query .= " varchar({$length})"; break; case AbstractMigration::TYPE_FLOAT: $length = $length ? $length : '0,0'; $query .= " float({$length})"; break; case AbstractMigration::TYPE_ENUM: if (is_array($length)) { // array to string 'el','el',... $length = "'" . join("','", $length) . "'"; } $query .= " enum({$length})"; break; default: $query .= " {$datatype}"; break; } if (!is_null($default)) { // switch statement for $datatype switch ($datatype) { case AbstractMigration::TYPE_TIMESTAMP && $default == 'CURRENT_TIMESTAMP': $query .= " default CURRENT_TIMESTAMP"; break; default: $query .= ' default ' . $this->getDbAdapter()->getPlatform()->quoteIdentifier($default); break; } } if ($notnull) { $query .= " NOT NULL"; } else { $query .= " NULL"; } if ($primary) { $metadata = new Metadata($this->getDbAdapter()); // TODO: drop primary key, add primary key (`all keys`,`$column`) $primary = array(); $constraints = $metadata->getConstraints($table); /** @var $constraint \Zend\Db\Metadata\Object\ConstraintObject */ foreach ($constraints as $constraint) { if ($constraint->isPrimaryKey()) { foreach ($constraint->getColumns() as $columnName) { array_push($primary, $columnName); } } } if (sizeof($primary)) { $keys = $quotedColumns = $this->quoteIdentifierArray($primary); $query .= ", drop primary key, add primary key ({$keys}, {$column})"; } else { $query .= ", add primary key ({$column})"; } } $this->query($query, Adapter::QUERY_MODE_EXECUTE); return $this; }
/** * add table to DB object * @param $tableName */ public function addTable($tableName) { if ($this->isTblWhiteListed($tableName) && !$this->isTblBlackListed($tableName)) { $metadata = new \Zend\Db\Metadata\Metadata($this->db); // get the table names $columns = $metadata->getColumns($tableName); $scheme = array(); /** @var $column \Zend\Db\Metadata\Object\ColumnObject */ foreach ($columns as $column) { $scheme[$column->getName()] = array('SCHEMA_NAME' => null, 'TABLE_NAME' => $column->getTableName(), 'COLUMN_NAME' => $column->getName(), 'COLUMN_POSITION' => $column->getOrdinalPosition(), 'DATA_TYPE' => $column->getDataType(), 'DEFAULT' => $column->getColumnDefault(), 'NULLABLE' => $column->isNullable(), 'LENGTH' => $column->getCharacterMaximumLength(), 'SCALE' => $column->getNumericScale(), 'PRECISION' => $column->getNumericPrecision(), 'UNSIGNED' => $column->getNumericUnsigned(), 'PRIMARY' => false, 'IDENTITY' => false); } /** @var $constraintObject \Zend\Db\Metadata\Object\ConstraintObject */ foreach ($metadata->getConstraints($tableName) as $constraintObject) { if ('PRIMARY KEY' === $constraintObject->getType()) { foreach ($constraintObject->getColumns() as $columnName) { $scheme[$columnName]['PRIMARY'] = true; $scheme[$columnName]['IDENTITY'] = true; } } } $this->scheme[$tableName] = $scheme; $this->indexes[$tableName] = $this->getIndexListFromTable($tableName); if (isset($this->options['loaddata']) && $this->options['loaddata'] == true) { $sql = new Sql($this->db); $this->data[$tableName] = $sql->prepareStatementForSqlObject($sql->select($tableName))->execute(); } } }