Oznámení
Omlouváme se, provoz fóra byl ukončen
dibi::getDatabaseInfo()->getTableInfo($table)->getForeignKeys() háže chybu „NotImplemented“ (driver PQSQL)
Upozornění: Tohle vlákno je hodně staré.
před 9 lety
- worsik
- Člen | 40
dibi v1.3-dev
nette v1.0-dev
PHP 5.3.0
Ahoj, snažím se vypsat si cizí klíče z tabulky, abych mohl provést export a nahradit FK hodnotami sloupců v cizích tabulkách.
Chtěl jsem použít fci
<?php
dibi::getDatabaseInfo()->getTableInfo($table)->getForeignKeys()
?>
, ale vyhazuje mi vyjímku NotImplementedException.
Znamená to tedy, že funkce je pouze předchystaná a ještě neexistuje?
Nebo nefunguje pouze pro PGSQL?
Díky za ohlasy
před 9 lety
- worsik
- Člen | 40
Tak jsem 3 hodiny strávil hraním si s PgMyAdminem a hledáním na webu a vytvořil jsem SQL dotaz, ktery vrati pro Postgres pole urcujici FK:
<?php
public static function getForeignKeys($table)
{
$sql = "
SELECT t.relname AS table_name
, t2.relname AS references_table
, a.attname AS column_name
, a2.attname AS references_column
FROM pg_constraint c
LEFT JOIN pg_index i ON c.conrelid = i.indrelid
LEFT JOIN pg_class t ON c.conrelid = t.oid
LEFT JOIN pg_class t2 ON c.confrelid = t2.oid
LEFT JOIN pg_class i2 ON i.indexrelid = i2.oid
LEFT JOIN pg_attribute a ON t.oid = a.attrelid
LEFT JOIN pg_attribute a2 ON t2.oid = a2.attrelid
WHERE
c.contype = 'f'
AND a.attnum = ANY(c.conkey)
AND a2.attnum = ANY(c.confkey)
AND a.attnum = ANY(i.indkey)
AND i.indisunique = 'f'
AND i.indisprimary = 'f'
AND t.relname = '$table'
";
return dibi::query($sql)->fetchAll();
}
?>
Funkce pak vrátí pro tabulku ‚acl‘
array(3) {
0 => object(DibiRow) (4) {
"table_name" => string(3) "acl"
"references_table" => string(13) "acl_resources"
"column_name" => string(10) "idresource"
"references_column" => string(2) "id"
}
1 => object(DibiRow) (4) {
"table_name" => string(3) "acl"
"references_table" => string(14) "acl_privileges"
"column_name" => string(11) "idprivilege"
"references_column" => string(2) "id"
}
2 => object(DibiRow) (4) {
"table_name" => string(3) "acl"
"references_table" => string(9) "acl_roles"
"column_name" => string(6) "idrole"
"references_column" => string(2) "id"
}
}
Snad to pomůže i někomu jinému, když jsem nad tím strávil tolik času…
Editoval worsik (4. 6. 2010 14:24)