symfony2 - using multiple connections in a repository or class

database-connection, multiple-databases, php, symfony

Solution

An `EntityRepository` should only be concerned with its owning entity (and manager)- so mixing your Entity Repositories with your Entity Managers really isn't the way to go. I suggest you create yourself a service and inject Doctrine - then you can query whatever you want. For example :

the config

[config.yml / services.yml]
services:
   sales_journal:
      class: Acme\DemoBundle\Service\SalesJournal
       arguments: ['@doctrine']

the service

[Acme\DemoBundle\Service\SalesJournal.php]

namespace Acme\DemoBundle\Service;

public class SalesJournal {

    private $connDefault;
    private $connBookings;
    private $connSessions;


    function __construct($doctrine)
    {
        $this->connDefault = $doctrine->getManager('default')->getConnection();
        $this->connBookings = $doctrine->getManager('bookings')->getConnection();
        $this->connSessions = $doctrine->getManager('sessions')->getConnection();
    }

    function testQuery()
    {
        $sql = "SELECT * FROM testTableBookings LIMIT 10";
        $stmt = $this->connBookings->prepare($sql);
        $results = $stmt->fetchAll();

        print_r($results);
    }

    function testQuery2()
    {
        $sql = "SELECT * FROM testTableSessions LIMIT 10";
        $stmt = $this->connSessions->prepare($sql);
        $results = $stmt->fetchAll();

        print_r($results);
    }
}

then from your controller or where ever you want to use the service you can do :

// get the service
$sales_journal = $this->get('sales_journal');
// call relevent function
$sales_journal->testQuery();

Problem

I have multiple connections and I have a repository class. I would like the repository class to have access to the multiple connections. Its for a report that requires fetching data from multiple database hosts. config.yml ``` doctrine: dbal: default_connection: default connections: default: driver: "%db_default_driver%" host: "%db_default_host%" etc.. bookings: driver: "%db_readonly_bookings_driver%" host: "%db_readonly_bookings_host%" etc ... sessions: etc.. ``` SalesJournalRepistory.php ``` namespace Portal\SalesJournalBundle\Repository; use Doctrine\ORM\EntityRepository; class SalesJournalRepository extends EntityRepository { public $connDefault = null; public $connBookings = null; public $connSessions = null; function __construct() { // this is where I get the error $this->connDefault = $this->getManager('default')->getConnection(); $this->connBookings = $this->getManager('bookings')->getConnection(); $this->connSessions = $this->getManager('sessions')->getConnection(); } function testQuery(){ $sql = "SELECT * FROM testTableBookings LIMIT 10"; $stmt = $this->connBookings->prepare($sql); $results = $stmt->fetchAll(); print_r($results); } function testQuery2(){ $sql = "SELECT * FROM testTableSessions LIMIT 10"; $stmt = $this->connSessions->prepare($sql); $results = $stmt->fetchAll(); print_r($results); } } ``` I can make it work from the a controller ``` $connDefault = $this->getDoctrine()->getManager('default')->getConnection(); $connBookings = $this->getDoctrine()->getManager('bookings')->getConnection(); ``` however im looking to be able to run it from the repository. Im getting the following error ``` PHP Fatal error: Call to a member function getConnection() on a non-object ``` I thought this may give some clue? enjecting entities however I am a little confused and not sure if it is?

Original source

Related problems