devture/dbal
devture/dbal is a lightweight PHP database abstraction layer built on top of Doctrine DBAL, offering Laravel-friendly helpers for connections, query execution, and transaction handling. Ideal when you want DBAL features without pulling in a full ORM.
Installation Add the package via Composer:
composer require devture/dbal
Register the service provider in config/app.php:
'providers' => [
Devture\Dbal\DbalServiceProvider::class,
],
Basic Usage
Define a connection in config/dbal.php:
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'test',
'username' => 'root',
'password' => '',
],
'mongodb' => [
'driver' => 'mongodb',
'host' => 'localhost',
'database' => 'test',
],
],
First Query
Inject the Dbal facade or use dependency injection:
use Devture\Dbal\Facades\Dbal;
// Relational DB
$users = Dbal::connection('mysql')->select('SELECT * FROM users WHERE id = ?', [1]);
// MongoDB
$users = Dbal::connection('mongodb')->select('SELECT * FROM users WHERE id = ?', [1]);
Dbal::connection('name') to switch between relational and NoSQL databases seamlessly.config/dbal.php:
'default' => 'mysql',
?) for security:
$result = Dbal::connection('mysql')->select('INSERT INTO logs (message) VALUES (?)', ['Test']);
execute():
Dbal::connection('mongodb')->execute('db.users.updateMany({ age: { $gt: 25 } }, { $set: { status: "active" } })');
transaction() for atomic operations:
Dbal::connection('mysql')->transaction(function ($conn) {
$conn->execute('UPDATE accounts SET balance = balance - ? WHERE id = ?', [100, 1]);
$conn->execute('UPDATE accounts SET balance = balance + ? WHERE id = ?', [100, 2]);
});
startSession() for multi-document transactions (requires MongoDB 4.0+):
$session = Dbal::connection('mongodb')->startSession();
$session->startTransaction();
try {
$session->execute('db.inventory.updateOne(...)');
$session->commitTransaction();
} catch (\Exception $e) {
$session->abortTransaction();
}
fetchAll(), fetch(), or fetchColumn():
$rows = Dbal::connection('mysql')->fetchAll('SELECT * FROM users');
$count = Dbal::connection('mysql')->fetchColumn('SELECT COUNT(*) FROM users');
if (Dbal::connection('mysql')->tableExists('users')) {
// Proceed
}
Driver-Specific Syntax:
db.collection.method() syntax, while relational DBs use SQL.SELECT with MongoDB’s find() or update().Transaction Limitations:
Result Format Inconsistencies:
$users = array_map(function ($row) {
return (array) $row; // Convert MongoDB documents to arrays if needed
}, $result);
Connection Pooling:
Enable Logging:
Add to config/dbal.php:
'logging' => true,
Logs will appear in Laravel’s default log channel.
Query Inspection:
Use Dbal::connection()->getDriver()->getConnection()->getWrappedConnection()->getDatabase()->executeQuery() to inspect raw queries (if needed).
Custom Drivers:
Extend Devture\Dbal\Drivers\DriverInterface to support additional databases (e.g., Redis, Elasticsearch).
Query Builders:
Integrate with Laravel’s query builder by wrapping Dbal in a custom facade:
class CustomDbal {
public function users() {
return Dbal::connection()->queryBuilder()->from('users');
}
}
Middleware: Use Laravel middleware to modify queries or connections dynamically:
Dbal::connection()->getMiddleware()->push(function ($query, $next) {
$query->setFetchMode(\PDO::FETCH_ASSOC);
return $next($query);
});
execute() with raw driver methods (e.g., insertMany for MongoDB).createIndex()) for complex queries.How can I help you explore Laravel packages today?