2013-03-07 2 views
10

Ich habe mehrere Verbindungen und ich habe eine Repository-Klasse. Ich möchte, dass die Repository-Klasse Zugriff auf die mehreren Verbindungen hat. Dies ist für einen Bericht erforderlich, der das Abrufen von Daten von mehreren Datenbankhosts erfordert.symfony2 - mit mehreren Verbindungen in einem Repository oder Klasse

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); 
    } 


} 

Ich kann es aus dem einen Controller

$connDefault = $this->getDoctrine()->getManager('default')->getConnection(); 
$connBookings = $this->getDoctrine()->getManager('bookings')->getConnection(); 

aber im suchen funktioniert der Lage sein, um es auszuführen aus dem Repository. Ich bekomme den folgenden Fehler:

PHP Fatal error: Call to a member function getConnection() on a non-object 

Ich dachte, das kann ein Hinweis geben? enjecting entities aber ich bin ein wenig verwirrt und nicht sicher, ob es ist?

Antwort

11

Ein sollte sich nur mit seiner Eigentümer-Entität (und seinem Manager) befassen - also ist es nicht der richtige Weg, Ihre Entity Repositories mit Ihren Entity Managern zu vermischen. Ich schlage vor, Sie erstellen sich einen Dienst und injizieren Doctrine - dann können Sie abfragen, was Sie wollen. Zum Beispiel:

die Config

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

der 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); 
    } 
} 

dann von Ihrem Controller oder wo auch immer Sie den Dienst verwenden möchten, können Sie tun:

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

yay hat funktioniert - danke. Ich bin seit einiger Zeit daran festgeklemmt. Ich habe es im Repository-Ordner aufbewahrt, aber nicht das extend-EntityRepository verwendet. Ich bin mir nicht sicher, ob es ein Dienst ist, da es nur ein Bericht ist, und ich habe gesagt, dass Abfragen in den Ordner Repository gehören. Was denkst du über dieses Setup? –

+0

@Robbo_UK können Sie Ihre Dienste überall - aber ich würde vorschlagen, dass der Ordner Repositories für Repositories ist ... Es ist OK, neue Ordner zu erstellen – ManseUK

2

sollten Sie Entity-Manager setzen Sie als zweiten Parameter von getRepository Methode wie folgt in Controller verwenden:

$repository = $this->getDoctrine()->getRepository('PortalSalesJournalBundle:SalesJournal', 'bookings'); 

und den Zugang, dass die Verbindung des Unternehmens-Manager in Repository-Klasse wie folgt aus:

namespace Portal\SalesJournalBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class SalesJournalRepository extends EntityRepository 
{ 
    function testQuery(){ 
     $connection = $this->getEntityManager()->getConnection(); 
    } 
} 
+1

Vielen Dank für die Antwort, aber ich suche alle Verbindungen zu verwenden? Das obige Beispiel scheint nur für eine Verbindung spezifisch zu sein. –