Installation Add the package via Composer in a Laravel project (note: this is a Symfony bundle, so use cautiously):
composer require doctrine/dbal-util/cli-bundle
Register the bundle in config/bundles.php (if using Symfony components) or wrap in a Laravel service provider.
First Use Case Run a basic DBAL command (e.g., schema inspection) via Artisan:
php artisan dbal:schema:inspect --connection=mysql
(Note: Laravel may require aliasing the command in app/Console/Kernel.php.)
Prerequisites
doctrine/dbal is installed (Laravel includes it by default)..env (e.g., DB_CONNECTION=mysql).Schema Management
dbal:schema:inspect to dump a database schema as SQL or JSON.
php artisan dbal:schema:inspect --format=json --output=schema.json
dbal:migration:execute (if using DBAL migrations).
php artisan dbal:migration:execute --path=migrations
Data Operations
dbal:query (useful for one-off scripts).
php artisan dbal:query "SELECT * FROM users LIMIT 10"
php artisan dbal:data:export --table=users --output=users.sql
Integration with Laravel
AppServiceProvider:
use Doctrine\DBAL\Connection;
public function register()
{
$this->app->singleton(Connection::class, function ($app) {
return \Doctrine\DBAL\DriverManager::getConnection($app['config']['database.connections.mysql']);
});
}
Symfony\Component\Console\Command\Command.Configuration
config/database.php under doctrine (if using Symfony-style config).'doctrine' => [
'dbal' => [
'driver' => 'pdo_mysql',
'url' => env('DATABASE_URL'),
],
],
Symfony Dependency
AppServiceProvider.app/Console/Kernel.php:
protected $commands = [
\Doctrine\DBALUtil\CLIBundle\Command\SchemaInspectCommand::class,
// Add other commands as needed
];
Connection Handling
--connection flags match your .env (e.g., mysql vs. pgsql).php artisan dbal:connection:info --connection=mysql
Migration Quirks
dbal:migration:execute for DBAL-specific migrations, not Eloquent migrations.Output Formatting
json_decode() in PHP:
$schema = json_decode(file_get_contents('schema.json'), true);
-v or -vv to commands for debug output.
php artisan dbal:schema:inspect -vv
config/database.php:
'logging' => true,
'logging_format' => '%%timestamp%% %%connection%% %%sql%%',
'logging_level' => \Doctrine\DBAL\Logging\Logger::DEBUG,
Custom Commands
Extend Doctrine\DBALUtil\CLIBundle\Command\AbstractCommand to add domain-specific logic:
namespace App\Console\Commands;
use Doctrine\DBALUtil\CLIBundle\Command\AbstractCommand;
class CustomExportCommand extends AbstractCommand
{
protected function configure()
{
$this->setName('dbal:custom:export');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// Custom logic
}
}
Event Listeners
Hook into DBAL events (e.g., postConnect) via Symfony’s event dispatcher:
$dispatcher->addListener(ConnectionEvents::POST_CONNECT, function (ConnectionEventArgs $args) {
$args->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping(...);
});
Laravel-Eloquent Bridge Use DBAL for raw queries while keeping Eloquent for ORM:
$dbalConnection = app(Connection::class);
$results = $dbalConnection->fetchAll("SELECT * FROM users WHERE active = 1");
How can I help you explore Laravel packages today?