/** * 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; }
/** * Gets the "RelatedBy*" suffix (if needed) that is attached to method and variable names. * * The related by suffix is based on the local columns of the foreign key. If there is more than * one column in a table that points to the same foreign table, then a 'RelatedByLocalColName' suffix * will be appended. * * @return string */ protected function getRelatedBySuffix(ForeignKey $fk, $columnCheck = false) { $relCol = ""; foreach ($fk->getLocalColumns() as $columnName) { $column = $fk->getTable()->getColumn($columnName); if (!$column) { throw new Exception("Could not fetch column: {$columnName} in table " . $fk->getTable()->getName()); } if (count($column->getTable()->getForeignKeysReferencingTable($fk->getForeignTableName())) > 1 || $fk->getForeignTableName() == $fk->getTable()->getName()) { // if there are seeral foreign keys that point to the same table // then we need to generate methods like getAuthorRelatedByColName() // instead of just getAuthor(). Currently we are doing the same // for self-referential foreign keys, to avoid confusion. $relCol .= $column->getPhpName(); } } #var_dump($fk->getForeignTableName() . ' - ' .$fk->getTableName() . ' - ' . $this->getTable()->getName()); #$fk->getForeignTableName() != $this->getTable()->getName() && // @todo comment on it if ($columnCheck && !$relCol && $fk->getTable()->getColumn($fk->getForeignTableName())) { foreach ($fk->getLocalColumns() as $columnName) { $column = $fk->getTable()->getColumn($columnName); $relCol .= $column->getPhpName(); } } if ($relCol != "") { $relCol = "RelatedBy" . $relCol; } return $relCol; }
public function getForeignKeyDDL(ForeignKey $fk) { $pattern = "\n-- SQLite does not support foreign keys; this is just for reference\n-- FOREIGN KEY (%s) REFERENCES %s (%s)\n"; return sprintf($pattern, $this->getColumnListDDL($fk->getLocalColumns()), $fk->getForeignTableName(), $this->getColumnListDDL($fk->getForeignColumns())); }
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; }
public function getForeignKeyDDL(ForeignKey $fk) { if ($fk->isSkipSql()) { return; } $pattern = "CONSTRAINT %s\r\n 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->hasOnDelete()) { $script .= "\r\n ON DELETE " . $fk->getOnDelete(); } return $script; }
/** * Gets the "RelatedBy*" suffix (if needed) that is attached to method and variable names. * * The related by suffix is based on the local columns of the foreign key. If there is more than * one column in a table that points to the same foreign table, then a 'RelatedByLocalColName' suffix * will be appended. * * @return string */ protected function getRelatedBySuffix(ForeignKey $fk) { $relCol = ""; foreach ($fk->getLocalColumns() as $columnName) { $column = $fk->getTable()->getColumn($columnName); if (!$column) { $e = new Exception("Could not fetch column: {$columnName} in table " . $fk->getTable()->getName()); print $e; throw $e; } if ($column->isMultipleFK() || $fk->getForeignTableName() == $fk->getTable()->getName()) { // if there are seeral foreign keys that point to the same table // then we need to generate methods like getAuthorRelatedByColName() // instead of just getAuthor(). Currently we are doing the same // for self-referential foreign keys, to avoid confusion. $relCol .= $column->getPhpName(); } } if ($relCol != "") { $relCol = "RelatedBy" . $relCol; } return $relCol; }
public function getFkPhpName(ForeignKey $fk) { if (count($localNames = $fk->getLocalColumns()) < 2 && '_id' == substr($localNames[0], -3)) { return substr($this->getTable()->getColumn($localNames[0])->getPhpName(), 0, -2); } return $this->getFkPhpNameAffix($fk); }