# 获取元数据

## 表元数据

这些方法让你可以获取表信息。

### 列出数据库中的所有表

#### $db->listTables()

返回一个数组，其中包含当前连接的数据库中所有表的名称。示例：

    <?php

    $db = db_connect();

    $tables = $db->listTables();

    foreach ($tables as $table) {
        echo $table;
    }

备注

某些驱动程序包含额外的系统表，这些表不会包含在此返回结果中。

### 确定表是否存在

#### $db->tableExists()

在对某个特定表执行操作之前，知道该表是否存在会很有帮助。此方法返回布尔值 true/false。用法示例：

    <?php

    $db = db_connect();

    if ($db->tableExists('table_name')) {
        // some code...
    }

备注

将 table_name 替换为你正在查找的表名。

## 字段元数据

### 列出表中的所有字段

#### $db->getFieldNames()

返回一个包含字段名称的数组。此查询可以通过两种方式调用：

1. 你可以提供表名，并从 `$db` 对象调用：

   >     <?php

   >     $db = db_connect();

   >     $fields = $db->getFieldNames('table_name');

   >     foreach ($fields as $field) {
   >         echo $field;
   >     }

2. 你可以通过从查询结果对象调用该方法，来获取你运行的任何查询所关联的字段名称：

   >     <?php

   >     $db = db_connect();

   >     $query = $db->query('SELECT * FROM some_table');

   >     foreach ($query->getFieldNames() as $field) {
   >         echo $field;
   >     }

### 确定字段是否存在于表中

#### $db->fieldExists()

在执行某个操作之前，知道特定字段是否存在会很有帮助。此方法返回布尔值 true/false。用法示例：

    <?php

    $db = db_connect();

    if ($db->fieldExists('field_name', 'table_name')) {
        // some code...
    }

备注

将 field_name 和 table_name 分别替换为你正在查找的列名和表名。

### 获取字段元数据

#### $db->getFieldData()

返回一个包含字段信息的对象数组。

有时收集字段名称或其他元数据（如列类型、最大长度等）会很有帮助。

备注

并非所有数据库都提供元数据。

用法示例：

    <?php

    $db = db_connect();

    $fields = $db->getFieldData('table_name');

    foreach ($fields as $field) {
        echo $field->name;
        echo $field->type;
        echo $field->max_length;
        echo $field->primary_key;
    }

如果数据库支持，此函数可返回以下数据：

- `name` - 字段名

- `type` - 字段的类型

- `max_length` - 字段的最大长度

- `nullable` - 如果字段可为空则为布尔值 `true`，否则为布尔值 `false`

- `default` - 默认值

- `primary_key` - 如果字段是主键则为整数 `1` （即使存在多个主键，也全为整数 `1`），否则为整数 `0` （此字段当前仅在 `MySQLi` 和 `SQLite3` 中可用）

备注

自 v4.4.0 版本起，SQLSRV 支持 `nullable`。

#### $query->getFieldData()

如果已经执行过查询，可以使用结果对象代替提供表名：

    <?php

    $db = db_connect();

    $query  = $db->query('YOUR QUERY');
    $fields = $query->getFieldData();

备注

返回的数据与 `$db->getFieldData()` 返回的数据不同。如果无法获取所需数据，请使用 `$db->getFieldData()`。

### 列出表中的所有索引

#### $db->getIndexData()

返回一个包含索引信息的对象数组。

用法示例：

    <?php

    $db = db_connect();

    $keys = $db->getIndexData('table_name');

    foreach ($keys as $key) {
        echo $key->name;
        echo $key->type;
        echo $key->fields; // array of field names
    }

键的类型可能因你使用的数据库而异。例如，MySQL 会为表关联的每个键返回 primary、fulltext、spatial、index 或 unique 中的一种。

SQLite3 会返回一个名为 `PRIMARY` 的伪索引。但它是一个特殊索引，不能在 SQL 命令中使用。

#### $db->getForeignKeyData()

返回一个包含外键信息的对象数组。

用法示例：

    <?php

    $db = db_connect();

    $keys = $db->getForeignKeyData('table_name');

    foreach ($keys as $key => $object) {
        echo $key === $object->constraint_name;
        echo $object->constraint_name;
        echo $object->table_name;
        echo $object->column_name[0]; // array
        echo $object->foreign_table_name;
        echo $object->foreign_column_name[0]; // array
        echo $object->on_delete;
        echo $object->on_update;
        echo $object->match;
    }

外键使用 `tableprefix_table_column1_column2_foreign` 命名约定。Oracle 使用略有不同的后缀 `_fk`。