public function testGetPrimaryKey() { $db = $this->getMockBuilder(Db::class)->disableOriginalConstructor()->getMock(); $db->expects($this->once())->method('getConventionPrimaryKey')->will($this->returnValue('language_id')); $table = new Table($db, 'language'); $this->assertSame('language_id', $table->getPrimaryKey()); }
/** * Returns whether or not this foreign key is also the primary key of * the local table. * * @return boolean True if all local columns are at the same time a primary key */ public function isLocalPrimaryKey() { $localPKCols = []; foreach ($this->parentTable->getPrimaryKey() as $lPKCol) { $localPKCols[] = $lPKCol->getName(); } return count($localPKCols) === count($this->localColumns) && !array_diff($localPKCols, $this->localColumns); }
protected function addPopulateFromVersion(&$script) { $ARclassName = $this->getActiveRecordClassName(); $versionTable = $this->behavior->getVersionTable(); $versionColumnName = $versionTable->getColumn($this->behavior->getParameter('version_column'))->getPhpName(); $versionARClassname = $this->builder->getNewStubObjectBuilder($versionTable)->getClassname(); $tablePKs = $this->table->getPrimaryKey(); $primaryKeyName = $tablePKs[0]->getPhpName(); $script .= "\n/**\n * Sets the properties of the curent object to the value they had at a specific version\n *\n * @param {$versionARClassname} \$version The version object to use\n * @param PropelPDO \$con the connection to use\n * @param array \$loadedObjects objects thats been loaded in a chain of populateFromVersion calls on referrer or fk objects.\n *\n * @return {$ARclassName} The current object (for fluent API support)\n */\npublic function populateFromVersion(\$version, \$con = null, &\$loadedObjects = array())\n{\n"; $script .= "\n \$loadedObjects['{$ARclassName}'][\$version->get{$primaryKeyName}()][\$version->get{$versionColumnName}()] = \$this;"; foreach ($this->table->getColumns() as $col) { $script .= "\n \$this->set" . $col->getPhpName() . "(\$version->get" . $col->getPhpName() . "());"; } foreach ($this->behavior->getVersionableFks() as $fk) { $foreignTable = $fk->getForeignTable(); $foreignVersionTable = $fk->getForeignTable()->getBehavior($this->behavior->getName())->getVersionTable(); $relatedClassname = $this->builder->getNewStubObjectBuilder($foreignTable)->getClassname(); $relatedVersionQueryBuilder = $this->builder->getNewStubQueryBuilder($foreignVersionTable); $this->builder->declareClassFromBuilder($relatedVersionQueryBuilder); $relatedVersionQueryClassname = $relatedVersionQueryBuilder->getClassname(); $fkColumnName = $fk->getLocalColumnName(); $fkColumnPhpName = $fk->getLocalColumn()->getPhpName(); $fkVersionColumnPhpName = $versionTable->getColumn($fkColumnName . '_version')->getPhpName(); $fkPhpname = $this->builder->getFKPhpNameAffix($fk, $plural = false); // FIXME: breaks lazy-loading $script .= "\n if (\$fkValue = \$version->get{$fkColumnPhpName}()) {\n if (isset(\$loadedObjects['{$relatedClassname}']) && isset(\$loadedObjects['{$relatedClassname}'][\$fkValue]) && isset(\$loadedObjects['{$relatedClassname}'][\$fkValue][\$version->get{$fkVersionColumnPhpName}()])) {\n \$related = \$loadedObjects['{$relatedClassname}'][\$fkValue][\$version->get{$fkVersionColumnPhpName}()];\n } else {\n \$related = new {$relatedClassname}();\n \$relatedVersion = {$relatedVersionQueryClassname}::create()\n ->filterBy{$fk->getForeignColumn()->getPhpName()}(\$fkValue)\n ->filterByVersion(\$version->get{$fkVersionColumnPhpName}())\n ->findOne(\$con);\n \$related->populateFromVersion(\$relatedVersion, \$con, \$loadedObjects);\n \$related->setNew(false);\n }\n \$this->set{$fkPhpname}(\$related);\n }"; } foreach ($this->behavior->getVersionableReferrers() as $fk) { $foreignTable = $fk->getTable(); $foreignBehavior = $foreignTable->getBehavior($this->behavior->getName()); $foreignVersionTable = $foreignBehavior->getVersionTable(); $fkColumn = $foreignVersionTable->getFirstPrimaryKeyColumn(); $fkVersionColumn = $foreignVersionTable->getColumn($this->behavior->getParameter('version_column')); $relatedClassname = $this->builder->getNewStubObjectBuilder($foreignTable)->getClassname(); $relatedVersionQueryBuilder = $this->builder->getNewStubQueryBuilder($foreignVersionTable); $this->builder->declareClassFromBuilder($relatedVersionQueryBuilder); $relatedVersionQueryClassname = $relatedVersionQueryBuilder->getClassname(); $relatedVersionPeerBuilder = $this->builder->getNewStubPeerBuilder($foreignVersionTable); $relatedVersionPeerClassname = $relatedVersionPeerBuilder->getClassname(); if ($fk->isLocalPrimaryKey()) { $fkPhpName = $this->builder->getRefFKPhpNameAffix($fk, $plural = false); $fkColumnId = $this->behavior->getReferrerIdsColumn($fk); $fkColumnVersion = $this->behavior->getReferrerVersionsColumn($fk); $fkColumnVersionPhpName = $fkColumnVersion->getPhpName(); $this->builder->declareClassFromBuilder($relatedVersionPeerBuilder); $script .= "\n if (\$fkValue = \$version->get{$fkColumnId->getPhpName()}()) {\n if (isset(\$loadedObjects['{$relatedClassname}']) && isset(\$loadedObjects['{$relatedClassname}'][\$fkValue]) && isset(\$loadedObjects['{$relatedClassname}'][\$fkValue][\$version->get{$fkColumnVersionPhpName}()])) {\n \$related = \$loadedObjects['{$relatedClassname}'][\$fkValue][\$version->get{$fkColumnVersionPhpName}()];\n } else {\n \$related = new {$relatedClassname}();\n \$relatedVersion = {$relatedVersionQueryClassname}::create()\n ->filterBy{$fk->getLocalColumn()->getPhpName()}(\$fkValue)\n ->filterByVersion(\$version->get{$fkColumnVersionPhpName}())\n ->findOne(\$con);\n \$related->populateFromVersion(\$relatedVersion, \$con, \$loadedObjects);\n \$related->setNew(false);\n }\n \$this->set{$fkPhpName}(\$related);\n }"; } else { $fkPhpNames = $this->builder->getRefFKPhpNameAffix($fk, $plural = true); $fkPhpName = $this->builder->getRefFKPhpNameAffix($fk, $plural = false); $fkColumnIds = $this->behavior->getReferrerIdsColumn($fk); $fkColumnVersions = $this->behavior->getReferrerVersionsColumn($fk); $this->builder->declareClassFromBuilder($relatedVersionPeerBuilder); $script .= "\n if (\$fkValues = \$version->get{$fkColumnIds->getPhpName()}()) {\n \$this->clear{$fkPhpNames}();\n \$fkVersions = \$version->get{$fkColumnVersions->getPhpName()}();\n \$query = {$relatedVersionQueryClassname}::create();\n foreach (\$fkValues as \$key => \$value) {\n \$c1 = \$query->getNewCriterion({$this->builder->getColumnConstant($fkColumn, $relatedVersionPeerClassname)}, \$value);\n \$c2 = \$query->getNewCriterion({$this->builder->getColumnConstant($fkVersionColumn, $relatedVersionPeerClassname)}, \$fkVersions[\$key]);\n \$c1->addAnd(\$c2);\n \$query->addOr(\$c1);\n }\n foreach (\$query->find(\$con) as \$relatedVersion) {\n if (isset(\$loadedObjects['{$relatedClassname}']) && isset(\$loadedObjects['{$relatedClassname}'][\$relatedVersion->get{$fkColumn->getPhpName()}()]) && isset(\$loadedObjects['{$relatedClassname}'][\$relatedVersion->get{$fkColumn->getPhpName()}()][\$relatedVersion->get{$fkVersionColumn->getPhpName()}()])) {\n \$related = \$loadedObjects['{$relatedClassname}'][\$relatedVersion->get{$fkColumn->getPhpName()}()][\$relatedVersion->get{$fkVersionColumn->getPhpName()}()];\n } else {\n \$related = new {$relatedClassname}();\n \$related->populateFromVersion(\$relatedVersion, \$con, \$loadedObjects);\n \$related->setNew(false);\n }\n \$this->add{$fkPhpName}(\$related);\n }\n\n \$this->resetPartial{$fkPhpNames}(false);\n }"; } } $script .= "\n\n return \$this;\n}\n"; }
/** * Retorna a chave primária do objeto Row. * * @return mixed */ public function getPk($useDirty = true) { $pkCol = $this->table->getPrimaryKey(); $data = $useDirty === true ? $this->data : $this->cleanData; if (is_array($pkCol)) { $pkArrayKeys = array_combine($pkCol, array_fill(0, count($pkCol), null)); return array_intersect_key($data, $pkArrayKeys); } else { return array_key_exists($pkCol, $data) ? $data[$pkCol] : null; } }
public function getAddTableDDL(Table $table) { $tableDescription = $table->hasDescription() ? $this->getCommentLineDDL($table->getDescription()) : ''; $lines = array(); foreach ($table->getColumns() as $column) { $lines[] = $this->getColumnDDL($column); } if ($table->hasPrimaryKey() && count($table->getPrimaryKey()) > 1) { $lines[] = $this->getPrimaryKeyDDL($table); } foreach ($table->getUnices() as $unique) { $lines[] = $this->getUniqueDDL($unique); } $sep = ",\n\t"; $pattern = "\n%sCREATE TABLE %s\n(\n\t%s\n);\n"; return sprintf($pattern, $tableDescription, $this->quoteIdentifier($table->getName()), implode($sep, $lines)); }
public function getAddPrimaryKeyDDL(Table $table) { if (is_array($table->getPrimaryKey()) && count($table->getPrimaryKey())) { return parent::getAddPrimaryKeyDDL($table); } }
/** * Returns the SQL for the primary key of a Table object * @return string */ public function getPrimaryKeyDDL(Table $table) { if ($table->hasPrimaryKey()) { return 'PRIMARY KEY (' . $this->getColumnListDDL($table->getPrimaryKey()) . ')'; } }
/** * Create a relation where each record has many linked records in another table but using a liking table * @param Table $toTable the related table definition * @param Table $pivot the pivot table definition * @param string|null $name the name of the relation (defaults to the related table name) * @param string|array|null $toTableColumn the local columns pointing to the pivot table * @param string|array|null $localColumn the pivot columns pointing to the related table PK * @return self */ public function manyToMany(Table $toTable, Table $pivot, $name = null, $toTableColumn = null, $localColumn = null) : Table { $pivotColumns = $pivot->getColumns(); $keymap = []; if (!isset($toTableColumn)) { $toTableColumn = []; } if (!is_array($toTableColumn)) { $toTableColumn = [$toTableColumn]; } foreach ($this->getPrimaryKey() as $k => $pkField) { $key = null; if (isset($toTableColumn[$pkField])) { $key = $toTableColumn[$pkField]; } elseif (isset($toTableColumn[$k])) { $key = $toTableColumn[$k]; } else { $key = $this->getName() . '_' . $pkField; } if (!in_array($key, $pivotColumns)) { throw new DatabaseException('Missing foreign key mapping'); } $keymap[$pkField] = $key; } $pivotKeymap = []; if (!isset($localColumn)) { $localColumn = []; } if (!is_array($localColumn)) { $localColumn = [$localColumn]; } foreach ($toTable->getPrimaryKey() as $k => $pkField) { $key = null; if (isset($localColumn[$pkField])) { $key = $localColumn[$pkField]; } elseif (isset($localColumn[$k])) { $key = $localColumn[$k]; } else { $key = $toTable->getName() . '_' . $pkField; } if (!in_array($key, $pivotColumns)) { throw new DatabaseException('Missing foreign key mapping'); } $pivotKeymap[$key] = $pkField; } if (!isset($name)) { $name = $toTable->getName() . '_' . implode('_', array_keys($keymap)); } $this->relations[$name] = ['name' => $name, 'table' => $toTable, 'keymap' => $keymap, 'many' => true, 'pivot' => $pivot, 'pivot_keymap' => $pivotKeymap, 'sql' => null, 'par' => []]; return $this; }
/** * Returns the SQL for the primary key of a Table object * @return string */ public function getPrimaryKeyDDL(Table $table) { if ($table->hasPrimaryKey()) { $keys = $table->getPrimaryKey(); //MySQL throws an 'Incorrect table definition; there can be only one auto column and it must be defined as a key' //if the primary key consists of multiple columns and if the first is not the autoIncrement one. So //this push the autoIncrement column to the first position if its not already. $autoIncrement = $table->getAutoIncrementPrimaryKey(); if ($autoIncrement && $keys[0] != $autoIncrement) { $idx = array_search($autoIncrement, $keys); if ($idx !== false) { unset($keys[$idx]); array_unshift($keys, $autoIncrement); } } return 'PRIMARY KEY (' . $this->getColumnListDDL($keys) . ')'; } }