Example #1
0
 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;
     }
 }
Example #5
0
 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));
 }
Example #6
0
 public function getAddPrimaryKeyDDL(Table $table)
 {
     if (is_array($table->getPrimaryKey()) && count($table->getPrimaryKey())) {
         return parent::getAddPrimaryKeyDDL($table);
     }
 }
Example #7
0
 /**
  * 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()) . ')';
     }
 }
Example #8
0
 /**
  * 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) . ')';
     }
 }