atlas/info
Atlas.Info discovers and exposes database schema information using an Atlas.Pdo Connection. Inspect tables, columns, indexes, and other metadata programmatically to support migrations, tooling, and code generation. Documentation: http://atlasphp.io/cassini/info/
composer require atlas/info
Atlas\Pdo\Connection instance. If using Laravel, wrap it in a service provider:
use Atlas\Pdo\Connection;
use Atlas\Info\Info;
$connection = Connection::new(config('database.connections.mysql'));
$info = Info::new($connection);
$tables = $info->fetchTableNames();
dd($tables); // Debug output
src/Info.php for the core API and src/Database/ for database-specific implementations (e.g., MysqlInfo.php, PgsqlInfo.php).Schema Discovery:
fetchTableNames() for all tables or specify a schema:
$tables = $info->fetchTableNames('custom_schema');
Column Introspection:
$columns = $info->fetchColumns('users');
foreach ($columns as $name => $def) {
if ($def['primary']) {
echo "Primary key: $name\n";
}
}
NOT NULL/default values.type: 'integer' → rules: ['integer']).Database-Specific Features:
$sequence = $info->fetchAutoincSequence('users');
options array for ENUM columns.Integration with Laravel:
Info as a singleton:
$this->app->singleton(Info::class, function ($app) {
return Info::new(Connection::new(config('database.default')));
});
// app/Facades/AtlasInfo.php
public static function getColumns(string $table) {
return app(Info::class)->fetchColumns($table);
}
Usage:
$columns = AtlasInfo::getColumns('users');
Caching Metadata:
$cacheKey = 'schema:users:columns';
$columns = Cache::remember($cacheKey, now()->addHours(1), function () use ($info) {
return $info->fetchColumns('users');
});
Schema Validation:
$expectedColumns = ['id', 'name', 'email'];
$actualColumns = array_keys($info->fetchColumns('users'));
assert(array_diff($expectedColumns, $actualColumns) === [], 'Schema mismatch!');
Dynamic Query Building:
$columns = $info->fetchColumns('products');
$where = [];
foreach ($columns as $name => $def) {
if ($def['type'] === 'integer' && $def['notnull']) {
$where[] = "$name > 0";
}
}
DB::table('products')->whereRaw(implode(' AND ', $where))->get();
Migration Helpers:
down() methods for migrations:
$columns = $info->fetchColumns('old_table');
foreach ($columns as $name => $def) {
echo "Schema::table('old_table', function (Blueprint \$table) {\n";
echo " \$table->dropColumn('$name');\n";
echo "});\n";
}
Atlas.Pdo Dependency:
Atlas\Pdo\Connection, not native PDO.use Atlas\Pdo\Connection;
use PDO;
$pdo = DB::connection()->getPdo();
$atlasConnection = Connection::new($pdo);
Database-Specific Quirks:
fetchAutoincSequence() returns null for non-PostgreSQL DBs.options may be missing in older versions (fixed in v1.2.1).default values for expressions).Schema Name Handling:
fetchTableNames('schema') may fail if the schema doesn’t exist.try {
$tables = $info->fetchTableNames('nonexistent_schema');
} catch (\Exception $e) {
$tables = [];
}
Column Default Values:
default values for numeric types are returned as int/float, not strings (since v1.2.0).$default = (string) $columns['price']['default'];
Views and System Tables:
fetchTableNames() excludes views/system tables (since v1.2.0), which may break existing logic.$allTables = DB::select("SHOW TABLES");
Log Raw Queries:
$connection->getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->getPdo()->setAttribute(PDO::ATTR_STATEMENT_CLASS, [\Atlas\Pdo\Statement::class, ['logQueries' => true]]);
Verify Database Support:
Atlas\Info\Database\ classes. Add custom implementations if needed.Handle NULL Defaults:
NULL for SQL expressions (e.g., DEFAULT CURRENT_TIMESTAMP). Normalize defaults:
$default = $columns['created_at']['default'] ?? 'NULL';
Custom Database Drivers:
Atlas\Info\Database\InfoInterface to support unsupported DBs (e.g., SQL Server):
class SqlServerInfo implements InfoInterface {
public function fetchTableNames(?string $schema = null): array {
// Custom implementation
}
// ... other methods
}
Override Auto-Detection:
Info class for a connection:
$info = Info::new($connection, SqlServerInfo::class);
Add Metadata Fields:
comment field):
$columns = $info->fetchColumns('users');
foreach ($columns as &$column) {
$column['comment'] = $this->fetchColumnComment('users', $column['name']);
}
Cache Invalidation:
migrated) to clear cached schema metadata:
Event::listen('migrated', function () {
Cache::forget('schema:*');
});
Avoid Frequent Calls:
Cache::remember('schema:tables', now()->addHours(6), function () use ($info) {
return $info->fetchTableNames();
});
Batch Processing:
LIMIT in raw queries.Connection Pooling:
$connection = Connection::new(config('database.default'), [
'pool' => true,
]);
How can I help you explore Laravel packages today?