+ private static function getConstraintName(string $tablename, string $fieldname, array $parameters)
+ {
+ $foreign_table = array_keys($parameters['foreign'])[0];
+ $foreign_field = array_values($parameters['foreign'])[0];
+
+ return $tablename . "-" . $fieldname. "-" . $foreign_table. "-" . $foreign_field;
+ }
+
+ private static function foreignCommand(string $tablename, string $fieldname, array $parameters) {
+ $foreign_table = array_keys($parameters['foreign'])[0];
+ $foreign_field = array_values($parameters['foreign'])[0];
+
+ $constraint = self::getConstraintName($tablename, $fieldname, $parameters);
+
+ $sql = "CONSTRAINT `" . $constraint . "` FOREIGN KEY (`" . $fieldname . "`)" .
+ " REFERENCES `" . $foreign_table . "` (`" . $foreign_field . "`)";
+
+ if (!empty($parameters['foreign']['on update'])) {
+ $sql .= " ON UPDATE " . strtoupper($parameters['foreign']['on update']);
+ } else {
+ $sql .= " ON UPDATE RESTRICT";
+ }
+
+ if (!empty($parameters['foreign']['on delete'])) {
+ $sql .= " ON DELETE " . strtoupper($parameters['foreign']['on delete']);
+ } else {
+ $sql .= " ON DELETE CASCADE";
+ }
+
+ return $sql;
+ }
+
+ private static function addForeignKey(string $tablename, string $fieldname, array $parameters)
+ {
+ return sprintf("ADD %s", self::foreignCommand($tablename, $fieldname, $parameters));
+ }
+
+ private static function dropForeignKey(string $constraint)
+ {
+ return sprintf("DROP FOREIGN KEY `%s`", $constraint);
+ }
+