tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

MySQL(i) driver foreign keys implementace (řešení)

před 10 lety

sodae
Nette Evangelist | 251

Nazdárek

Zkusil jsem dostat cizí klíče z mysql ale nenašel jsem cestou pomocí sql příkazu.

/**
 * Returns metadata for all foreign keys in a table.
     *
     * @author Jakub Vrána original code from Adminer
     * @author Martin Sadový convert to dibi
     *
 * @param  string
 * @return array
 */
public function getForeignKeys($table)
{
            static $pattern = '(?:[^`]|``)+';
            static $onActions = array('RESTRICT', 'NO ACTION', 'CASCADE', 'SET NULL', '');
            $return = array();
            $result = $this->query("SHOW CREATE TABLE `$table`")->fetch(TRUE);
            if ($result) {
                    preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $onActions) . "))?(?: ON UPDATE (" . implode("|", $onActions) . "))?~",
                                    $result['Create Table'], $matches, PREG_SET_ORDER);
                    foreach ($matches as $match) {
                            preg_match_all("~`($pattern)`~", $match[2], $source);
                            preg_match_all("~`($pattern)`~", $match[5], $target);
                            $return[$match[1]] = array(
                                    "name" => $match[1],
                                    "local" => $source[1],
                                    "table" => strlen($match[4]) ? $match[4] : $match[3],
                                    "foreign" => $target[1],
                                    "onDelete" => $match[6],
                                    "onUpdate" => $match[7],
                            );
                    }
            }
            return $return;
}

Je potřeba mít tabulku v innoDB jinak to nepůjde.

Původní kód je z Adminera (Jakub Vrána), a přizpůsobil jsem ho do dibi.

Editoval sodae (2. 1. 2010 16:35)

před 10 lety

vrana
Člen | 130

V MySQL 5 lze použít tabulku information_schema.KEY_COLUMN_USAGE.