/** * 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 if (array_map('strtolower', $fromFk->getLocalColumns()) != array_map('strtolower', $toFk->getLocalColumns())) { return true; } if (array_map('strtolower', $fromFk->getForeignColumns()) != array_map('strtolower', $toFk->getForeignColumns())) { 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; }
/** * 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 onDelete and onUpdate: * * "RESTRICT" and its synonym "NO ACTION" is default and is not being reported explicitly. */ $equalBehavior = array('', 'RESTRICT', 'NO ACTION'); $fromOnUpdate = strtoupper($fromFk->normalizeFKey($fromFk->getOnUpdate())); $toOnUpdate = strtoupper($toFk->normalizeFKey($toFk->getOnUpdate())); if (in_array($fromOnUpdate, $equalBehavior) && !in_array($toOnUpdate, $equalBehavior) || !in_array($fromOnUpdate, $equalBehavior) && in_array($toOnUpdate, $equalBehavior)) { return true; } $fromOnDelete = strtoupper($fromFk->normalizeFKey($fromFk->getOnDelete())); $toOnDelete = strtoupper($toFk->normalizeFKey($toFk->getOnDelete())); if (in_array($fromOnDelete, $equalBehavior) && !in_array($toOnDelete, $equalBehavior) || !in_array($fromOnDelete, $equalBehavior) && in_array($toOnDelete, $equalBehavior)) { return true; } // compare skipSql if ($fromFk->isSkipSql() != $toFk->isSkipSql()) { return true; } return false; }
public function getForeignKeyDDL(ForeignKey $fk) { if ($fk->isSkipSql()) { return; } $pattern = 'CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)'; $script = sprintf($pattern, $this->quoteIdentifier($fk->getName()), $this->getColumnListDDL($fk->getLocalColumns()), $this->quoteIdentifier($fk->getForeignTableName()), $this->getColumnListDDL($fk->getForeignColumns())); if ($fk->hasOnUpdate() && $fk->getOnUpdate() != ForeignKey::SETNULL) { $script .= ' ON UPDATE ' . $fk->getOnUpdate(); } if ($fk->hasOnDelete() && $fk->getOnDelete() != ForeignKey::SETNULL) { $script .= ' ON DELETE ' . $fk->getOnDelete(); } return $script; }