cleentfaar/doctrine-table-prefix-bundle
composer require cleentfaar/doctrine-table-prefix-bundle
config/bundles.php:
Cleentfaar\DoctrineTablePrefixBundle\CleentfaarDoctrineTablePrefixBundle::class => ['all' => true],
config/packages/doctrine.yaml:
cleentfaar_doctrine_table_prefix:
prefixes: ['acme_', 'legacy_'] # List of prefixes to recognize
acme_users instead of users).Migrations:
prefixes in doctrine.yaml to ensure all migrations align with the schema. Example:
// src/Migrations/VersionYYYYMMDDHHMMSS.php
public function up(Schema $schema)
{
$this->addSql('CREATE TABLE acme_users (...)');
}
php bin/console doctrine:migrations:migrate
Entity Mapping:
@Table(name="acme_users") or use setTable() in buildTableDefinition():
// src/Entity/User.php
/** @ORM\Table(name="acme_users") */
class User { ... }
EntityListener:
$em->getClassMetadata(User::class)->setTableName('acme_users');
Query Builder:
$users = $entityManager->createQueryBuilder()
->select('u')
->from('App\Entity\User', 'u')
->where('u.id = :id')
->getQuery()
->getResult();
User to acme_users seamlessly.Multi-Environment Prefixes:
config/packages/dev/doctrine.yaml or prod/doctrine.yaml:
cleentfaar_doctrine_table_prefix:
prefixes: ['dev_'] # Environment-specific
Schema Updates:
doctrine:schema:update with --complete to sync prefixed tables:
php bin/console doctrine:schema:update --complete
Case Sensitivity:
acme_ matches exactly (e.g., ACME_ won’t work unless configured).Existing Schema Conflicts:
prefixes: ['', 'acme_'] to include empty prefix (default tables).Caching Issues:
php bin/console cache:clear
php bin/console doctrine:cache:clear-metadata
Third-Party Bundles:
Composite Prefixes:
acme_ and acme_test_). Solution:
Enable SQL Logging:
# config/packages/dev/doctrine.yaml
doctrine:
dbal:
logging: true
SELECT * FROM acme_users).Metadata Dump:
php bin/console debug:container --parameter=cleentfaar_doctrine_table_prefix.prefixes
Dynamic Prefixes:
PrefixResolver service:
# config/services.yaml
Cleentfaar\DoctrineTablePrefixBundle\Resolver\PrefixResolverInterface: '@custom.prefix_resolver'
// src/Resolver/CustomPrefixResolver.php
class CustomPrefixResolver implements PrefixResolverInterface {
public function resolve(string $entityClass): string {
return $entityClass === User::class ? 'dynamic_' . date('Ymd') . '_users' : '';
}
}
Event Listeners:
entity.load_class_metadata to modify table names dynamically:
// src/EventListener/PrefixListener.php
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) {
$metadata = $eventArgs->getClassMetadata();
$metadata->setTableName('acme_' . $metadata->getTableName());
}
Register in services.yaml:
services:
App\EventListener\PrefixListener:
tags: ['doctrine.event_listener', { event: 'loadClassMetadata' }]
Database-Specific Quirks:
search_path includes the schema with prefixed tables:
ALTER DATABASE your_db SET search_path TO public, acme_schema;
How can I help you explore Laravel packages today?