b2pweb/bdf-prime-persistence
Installation
composer require b2pweb/bdf-prime-persistence
Ensure b2pweb/bdf-prime-persistence is listed in composer.json under require.
Register the Service Provider
Add to config/app.php under providers:
B2PWeb\BDFPersistence\PrimePersistenceServiceProvider::class,
Configure Doctrine Adapter Publish the config file:
php artisan vendor:publish --provider="B2PWeb\BDFPersistence\PrimePersistenceServiceProvider" --tag="config"
Update config/prime-persistence.php with your Doctrine DBAL connection settings.
First Use Case: Basic Query
use B2PWeb\BDFPersistence\PrimePersistence;
use Prime\ORM;
$persistence = app(PrimePersistence::class);
$user = $persistence->find(ORM\User::class, 1); // Fetch user with ID 1
Replace Prime’s Default Persistence
Override Prime’s default persistence layer by binding the adapter in AppServiceProvider:
public function register()
{
$this->app->bind(
\Prime\Persistence\PersistenceInterface::class,
\B2PWeb\BDFPersistence\PrimePersistence::class
);
}
Leverage Doctrine DBAL for Complex Queries Use Doctrine’s query builder for advanced SQL operations:
$queryBuilder = $persistence->getQueryBuilder();
$results = $queryBuilder
->select('u.*')
->from('users', 'u')
->where('u.active = :active')
->setParameter('active', 1)
->fetchAllAssociative();
Hybrid ORM + Raw SQL Combine Prime’s ORM features with raw SQL via the adapter:
// Fetch a model using ORM
$user = ORM::forTable('users')->find(1);
// Use Doctrine for a custom query
$stats = $persistence->executeQuery('SELECT COUNT(*) FROM users WHERE created_at > ?', [now()->subDays(7)]);
Transaction Management Wrap operations in transactions for atomicity:
$persistence->getConnection()->beginTransaction();
try {
ORM::forTable('users')->create(['name' => 'John']);
ORM::forTable('posts')->create(['user_id' => 1, 'title' => 'Hello']);
$persistence->getConnection()->commit();
} catch (\Exception $e) {
$persistence->getConnection()->rollBack();
throw $e;
}
Schema Migrations Use Doctrine’s SchemaTool for migrations (if needed):
$schemaManager = $persistence->getSchemaManager();
$schemaManager->createTable(new \Doctrine\DBAL\Schema\Table('new_table'));
Connection Configuration
prime-persistence.php matches your Doctrine DBAL connection settings.'connection' => 'mysql_secondary',
Query Builder vs. ORM
ORM::forTable() for model-specific operations and the adapter’s QueryBuilder for complex joins/aggregations.Transaction Isolation
$persistence->getConnection()->beginTransaction(); // Use this, not ORM::transaction()
Schema Differences
$table = $schemaManager->createTable('users');
$table->addColumn('id', 'integer', ['autoincrement' => true]);
Performance
$conn = $persistence->getConnection();
$conn->transactional(function () use ($conn, $users) {
$conn->insert('users', $users);
});
Enable Doctrine Logging
Add to config/prime-persistence.php:
'logging' => true,
Logs will appear in storage/logs/laravel.log.
Query Profiling Use Doctrine’s profiler to analyze slow queries:
$profiler = $persistence->getConnection()->getConfiguration()->getSQLLogger();
$profiler->startLogging();
Custom Query Builders Extend the adapter to add domain-specific query methods:
class CustomPersistence extends PrimePersistence {
public function findActiveUsers() {
return $this->getQueryBuilder()
->select('*')
->from('users')
->where('active = 1')
->fetchAllAssociative();
}
}
Event Listeners
Attach Doctrine events (e.g., postInsert) via the adapter’s connection:
$connection->getEventManager()->addEventListener(
\Doctrine\DBAL\Connection::EVENT_POST_INSERT,
function ($eventArgs) {
// Post-insert logic
}
);
Repository Pattern Combine with Laravel’s repositories for cleaner architecture:
class UserRepository {
protected $persistence;
public function __construct(PrimePersistence $persistence) {
$this->persistence = $persistence;
}
public function findByEmail($email) {
return $this->persistence->find(ORM\User::class, ['email' => $email]);
}
}
How can I help you explore Laravel packages today?