Oznámení
Omlouváme se, provoz fóra byl ukončen
MySQL(i) driver foreign keys implementace (řešení)
Upozornění: Tohle vlákno je hodně staré.
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
.