L'esigenza
La dashboard EasyAdmin gira sul database applicativo. Ma le statistiche di frequentazione provengono da un database di analytics separato. Volevo mostrare questi numeri direttamente nella dashboard.
La trappola
Non si mescolano due database con una sola connessione Doctrine:
// Echoue : la table analytics n'existe pas dans la base applicative
$this->em->getRepository(PageView::class)->count([]);
La soluzione — due connessioni
# config/packages/doctrine.yaml
doctrine:
    dbal:
        connections:
            default: { url: '%env(DATABASE_URL)%' }
            tracker: { url: '%env(TRACKER_DATABASE_URL)%' }
Per l'aggregazione read-only, il DBAL grezzo è più diretto dell'ORM:
public function __construct(
    #[Autowire(service: 'doctrine.dbal.tracker_connection')]
    private Connection $tracker,
) {}

public function getStats(): array
{
    return [
        'views_today' => (int) $this->tracker->fetchOne(
            'SELECT COUNT(*) FROM page_views WHERE DATE(created_at) = CURDATE()'
        ),
        'top_pages' => $this->tracker->fetchAllAssociative(
            'SELECT path, COUNT(*) AS hits FROM page_views
             GROUP BY path ORDER BY hits DESC LIMIT 10'
        ),
    ];
}
Cosa mi porto a casa
  • Multi-database = più connessioni Doctrine ben nominate.
  • Per l'aggregazione read-only, il DBAL è più diretto dell'ORM.
  • Mantenere l'analytics nel proprio database: disaccoppiamento pulito.