tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

dibi::getDatabaseInfo()->getTableInfo($table)->getForeignKeys() háže chybu „NotImplemented“ (driver PQSQL)

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)