/** * 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; }
public function getForeignKeyDDL(ForeignKey $fk) { if ($fk->isSkipSql() || $fk->isPolymorphic()) { return; } $pattern = 'CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)'; $script = sprintf($pattern, $this->quoteIdentifier($fk->getName()), $this->getColumnListDDL($fk->getLocalColumnObjects()), $this->quoteIdentifier($fk->getForeignTableName()), $this->getColumnListDDL($fk->getForeignColumnObjects())); 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; }
public function getForeignKeyDDL(ForeignKey $fk) { if ($fk->isSkipSql() || $fk->isPolymorphic()) { return; } $pattern = "CONSTRAINT %s\n FOREIGN KEY (%s) REFERENCES %s (%s)"; $script = sprintf($pattern, $this->quoteIdentifier($fk->getName()), $this->getColumnListDDL($fk->getLocalColumnObjects()), $this->quoteIdentifier($fk->getForeignTableName()), $this->getColumnListDDL($fk->getForeignColumnObjects())); if ($fk->hasOnDelete()) { $script .= "\n ON DELETE " . $fk->getOnDelete(); } return $script; }
public function getForeignKeyDDL(ForeignKey $fk) { if ($fk->isSkipSql() || !$this->foreignKeySupport) { return; } $pattern = "FOREIGN KEY (%s) REFERENCES %s (%s)"; $script = sprintf($pattern, $this->getColumnListDDL($fk->getLocalColumns()), $this->quoteIdentifier($fk->getForeignTableName()), $this->getColumnListDDL($fk->getForeignColumns())); if ($fk->hasOnUpdate()) { $script .= "\n ON UPDATE " . $fk->getOnUpdate(); } if ($fk->hasOnDelete()) { $script .= "\n ON DELETE " . $fk->getOnDelete(); } return $script; }
/** * Appends the generated <foreign-key> XML node to its parent node. * * @param ForeignKey $foreignKey The ForeignKey model instance * @param \DOMNode $parentNode The parent DOMNode object */ private function appendForeignKeyNode(ForeignKey $foreignKey, \DOMNode $parentNode) { $foreignKeyNode = $parentNode->appendChild($this->document->createElement('foreign-key')); $foreignKeyNode->setAttribute('foreignTable', $foreignKey->getForeignTableCommonName()); if ($schema = $foreignKey->getForeignSchemaName()) { $foreignKeyNode->setAttribute('foreignSchema', $schema); } $foreignKeyNode->setAttribute('name', $foreignKey->getName()); if ($phpName = $foreignKey->getPhpName()) { $foreignKeyNode->setAttribute('phpName', $phpName); } if ($refPhpName = $foreignKey->getRefPhpName()) { $foreignKeyNode->setAttribute('refPhpName', $refPhpName); } if ($defaultJoin = $foreignKey->getDefaultJoin()) { $foreignKeyNode->setAttribute('defaultJoin', $defaultJoin); } if ($onDeleteBehavior = $foreignKey->getOnDelete()) { $foreignKeyNode->setAttribute('onDelete', $onDeleteBehavior); } if ($onUpdateBehavior = $foreignKey->getOnUpdate()) { $foreignKeyNode->setAttribute('onUpdate', $onUpdateBehavior); } for ($i = 0, $size = count($foreignKey->getLocalColumns()); $i < $size; $i++) { $refNode = $foreignKeyNode->appendChild($this->document->createElement('reference')); $refNode->setAttribute('local', $foreignKey->getLocalColumnName($i)); $refNode->setAttribute('foreign', $foreignKey->getForeignColumnName($i)); } foreach ($foreignKey->getVendorInformation() as $vendorInformation) { $this->appendVendorInformationNode($vendorInformation, $foreignKeyNode); } }
public function testGetOnActionBehaviors() { $fk = new ForeignKey(); $fk->setOnUpdate('SETNULL'); $fk->setOnDelete('CASCADE'); $this->assertSame('SET NULL', $fk->getOnUpdate()); $this->assertTrue($fk->hasOnUpdate()); $this->assertSame('CASCADE', $fk->getOnDelete()); $this->assertTrue($fk->hasOnDelete()); }