SequelPro en Magento gebruiken beide de SHOW CREATE TABLE-query om de refererende sleutelinformatie te laden. De implementatie van Magento is degene waar ik naar ga verwijzen, omdat het zowel een op PHP gebaseerd systeem is dat we allebei erg goed kennen. De volgende codefragmenten kunnen echter worden toegepast op elk op PHP gebaseerd systeem.
Het ontleden wordt gedaan in de Varien_Db_Adapter_Pdo_Mysql::getForeignKeys()
methode (de code voor deze klasse is hier te vinden
) met een relatief eenvoudige RegEx:
$createSql = $this->getCreateTable($tableName, $schemaName);
// collect CONSTRAINT
$regExp = '#,\s+CONSTRAINT `([^`]*)` FOREIGN KEY \(`([^`]*)`\) '
. 'REFERENCES (`[^`]*\.)?`([^`]*)` \(`([^`]*)`\)'
. '( ON DELETE (RESTRICT|CASCADE|SET NULL|NO ACTION))?'
. '( ON UPDATE (RESTRICT|CASCADE|SET NULL|NO ACTION))?#';
$matches = array();
preg_match_all($regExp, $createSql, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$ddl[strtoupper($match[1])] = array(
'FK_NAME' => $match[1],
'SCHEMA_NAME' => $schemaName,
'TABLE_NAME' => $tableName,
'COLUMN_NAME' => $match[2],
'REF_SHEMA_NAME' => isset($match[3]) ? $match[3] : $schemaName,
'REF_TABLE_NAME' => $match[4],
'REF_COLUMN_NAME' => $match[5],
'ON_DELETE' => isset($match[6]) ? $match[7] : '',
'ON_UPDATE' => isset($match[8]) ? $match[9] : ''
);
}
In het doc-blok wordt de resulterende array als volgt beschreven:
/**
* The return value is an associative array keyed by the UPPERCASE foreign key,
* as returned by the RDBMS.
*
* The value of each array element is an associative array
* with the following keys:
*
* FK_NAME => string; original foreign key name
* SCHEMA_NAME => string; name of database or schema
* TABLE_NAME => string;
* COLUMN_NAME => string; column name
* REF_SCHEMA_NAME => string; name of reference database or schema
* REF_TABLE_NAME => string; reference table name
* REF_COLUMN_NAME => string; reference column name
* ON_DELETE => string; action type on delete row
* ON_UPDATE => string; action type on update row
*/
Ik weet dat het niet precies . is waar je om vroeg, omdat het de uitvoer SHOW CREATE TABLE gebruikt, maar op basis van mijn bevindingen lijkt dit de algemeen geaccepteerde manier om dingen te doen.