2013-03-07 15 views
10

Birden çok bağlantım var ve bir depo sınıfım var. Depo sınıfının çoklu bağlantılara erişmesini istiyorum. Birden fazla veritabanı ana bilgisayarından veri almayı gerektiren bir rapor için.symfony2 - Bir havuzda veya sınıfta birden çok bağlantı kullanarak

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


} 

Ben bir denetleyici çalışmak yapabilirsiniz

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

ancak muktedir isteyen im onu çalıştırmak için depodan. Aşağıdaki hata iletisini alıyorum Bu bir ipucu verebilir mi diye düşünebilirsiniz? enjecting entities Ancak ben biraz kafam karıştı ve olup olmadığından emin değil misiniz?

cevap

11

Bir EntityRepository sadece kendi varlığından (ve yöneticiden) sorumlu olmalıdır - bu nedenle, Varlık Depoları'nızı Varlık Yöneticilerinizle karıştırmak gerçekten bir yol değildir. Kendinize bir hizmet oluşturmanızı ve Doktrin'i enjekte etmenizi öneririm - sonra ne isterseniz onu sorgulayabilirsiniz. Örneğin:

yapılandırma

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

hizmet

denetleyicisi veya yerden sonra
[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); 
    } 
} 

sen yapabileceğiniz hizmeti kullanmak istiyorum hiç:

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

yay işe yaradı - teşekkürler. Uzun bir süredir bu konu üzerinde sıkışıp kaldım. Depo klasöründe tuttum, ancak EntityRepository uzantısını kullanmadım. Sadece bir rapor olarak onun bir hizmet olduğundan emin değilim ve im sorgular Deposu klasörüne ait olduğunu söyledi. Bu kurulum hakkında ne düşünüyorsun? –

+0

@Robbo_UK hizmetlerinizi herhangi bir yere koyabilirsiniz - ancak depolar klasörünün depolar için olduğunu öneririm ... Yeni klasörler oluşturmak için Tamam – ManseUK

2

Eğer ikinci böyle getRepository yönteminin parametresi olarak kontrolöre kullanmak istediğiniz varlık yöneticisi belirlesin:

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

ve erişim bu böyle depo sınıfında varlık yöneticisinin bağlantısı:

namespace Portal\SalesJournalBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

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

için teşekkürler cevap ama tüm bağlantıları kullanmak için im arıyorum? Yukarıdaki örnek sadece bir bağlantıya özgü görünüyor? –