/** * Compute the difference between two Foreign key objects * * @param ForeignKey $fromFk * @param ForeignKey $toFk * * @param boolean $caseInsensitive Whether the comparison is case insensitive. * False by default. * * @return boolean false if the two fks are similar, true if they have differences */ public static function computeDiff(ForeignKey $fromFk, ForeignKey $toFk, $caseInsensitive = false) { // Check for differences in local and remote table $test = $caseInsensitive ? strtolower($fromFk->getTableName()) != strtolower($toFk->getTableName()) : $fromFk->getTableName() != $toFk->getTableName(); if ($test) { return true; } $test = $caseInsensitive ? strtolower($fromFk->getForeignTableName()) != strtolower($toFk->getForeignTableName()) : $fromFk->getForeignTableName() != $toFk->getForeignTableName(); if ($test) { return true; } // compare columns $fromFkLocalColumns = $fromFk->getLocalColumns(); sort($fromFkLocalColumns); $toFkLocalColumns = $toFk->getLocalColumns(); sort($toFkLocalColumns); if (array_map('strtolower', $fromFkLocalColumns) != array_map('strtolower', $toFkLocalColumns)) { return true; } $fromFkForeignColumns = $fromFk->getForeignColumns(); sort($fromFkForeignColumns); $toFkForeignColumns = $toFk->getForeignColumns(); sort($toFkForeignColumns); if (array_map('strtolower', $fromFkForeignColumns) != array_map('strtolower', $toFkForeignColumns)) { return true; } // compare on if ($fromFk->normalizeFKey($fromFk->getOnUpdate()) != $toFk->normalizeFKey($toFk->getOnUpdate())) { return true; } if ($fromFk->normalizeFKey($fromFk->getOnDelete()) != $toFk->normalizeFKey($toFk->getOnDelete())) { return true; } // compare skipSql if ($fromFk->isSkipSql() != $toFk->isSkipSql()) { return true; } return false; }
/** * Adds the useFkQuery method for this object. * @param string &$script The script will be modified in this method. * @param ForeignKey $fk */ protected function addUseRefFkQuery(&$script, ForeignKey $fk) { $fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName()); $fkQueryBuilder = $this->getNewStubQueryBuilder($fkTable); $queryClass = $this->getClassNameFromBuilder($fkQueryBuilder, true); $relationName = $this->getRefFKPhpNameAffix($fk); $joinType = $this->getJoinType($fk); $this->addUseRelatedQuery($script, $fkTable, $queryClass, $relationName, $joinType); }
protected static function getRefRelatedBySuffix(ForeignKey $fk) { $relCol = ''; foreach ($fk->getLocalForeignMapping() as $localColumnName => $foreignColumnName) { $localTable = $fk->getTable(); $localColumn = $localTable->getColumn($localColumnName); if (!$localColumn) { throw new RuntimeException(sprintf('Could not fetch column: %s in table %s.', $localColumnName, $localTable->getName())); } $foreignKeysToForeignTable = $localTable->getForeignKeysReferencingTable($fk->getForeignTableName()); if ($fk->getForeignTableName() == $fk->getTableName()) { // self referential foreign key $relCol .= $fk->getForeignTable()->getColumn($foreignColumnName)->getPhpName(); if (count($foreignKeysToForeignTable) > 1) { // several self-referential foreign keys $relCol .= array_search($fk, $foreignKeysToForeignTable); } } elseif (count($foreignKeysToForeignTable) > 1 || count($fk->getForeignTable()->getForeignKeysReferencingTable($fk->getTableName())) > 0) { // several foreign keys to the same table, or symmetrical foreign key in foreign table $relCol .= $localColumn->getPhpName(); } } if (!empty($relCol)) { $relCol = 'RelatedBy' . $relCol; } return $relCol; }
public function testSetTable() { $table = $this->getTableMock('book'); $table->expects($this->once())->method('getSchema')->will($this->returnValue('books')); $fk = new ForeignKey(); $fk->setTable($table); $this->assertInstanceOf('Propel\\Generator\\Model\\Table', $fk->getTable()); $this->assertSame('books', $fk->getSchemaName()); $this->assertSame('book', $fk->getTableName()); }