Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 2 lety

sodae
Nette Evangelist
Registrovaný: 8. 1. 2009
Příspěvky: 276

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

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)


Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítání

Twitter: http://twitter.com/MartinSadovy

 

#2 před 2 lety

vrana
Člen
Registrovaný: 23. 2. 2005
Příspěvky: 120

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

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

 

Zápatí