2013-03-07 8 views
10

私は複数の接続があり、私はリポジトリクラスを持っています。リポジトリクラスが複数の接続にアクセスできるようにしたいと思います。これは、複数のデータベースホストからデータを取得する必要があるレポートです。symfony2 - リポジトリまたはクラスで複数の接続を使用する

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


} 

私はそれがコントローラから動作させることができます

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

ができるようにするために探してイムそれを実行するリポジトリから。次のエラーが発生しました

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

これは手がかりを与えるかもしれないと思いましたか? enjecting entitiesしかし、私はちょっと混乱していて、それがわからないのですか?

答えて

11

EntityRepositoryは所有エンティティ(およびマネージャ)にのみ関係する必要があります。エンティティリポジトリとエンティティマネージャを実際に混在させるのは実際の方法ではありません。自分でサービスを作成し、Doctrineを挿入することをお勧めします。たとえば、次のように

設定

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

サービス

お使いのコントローラや場所から、その後
[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); 
    } 
} 

あなたが行うことができ、サービス利用したい史上:

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

- ありがとう。私はかなり長い間これに固執してきました。私はリポジトリフォルダに保管しましたが、拡張EntityRepositoryを使用しませんでした。私はそのサービスが単なるレポートであるとは思っていません。そして、私は、クエリがリポジトリフォルダに属していると言っています。あなたはその設定についてどう思いますか? –

+0

@Robbo_UKあなたはどこにでもあなたのサービスを置くことができます - しかし、私はリポジトリフォルダがリポジトリ用であることを示唆しています...その新しいフォルダを作成するOK – ManseUK

2

あなたは、このようなgetRepositoryメソッドの2番目のパラメータとしてコントローラで使用するエンティティマネージャを設定する必要があります、このようなリポジトリクラス内のエンティティ・マネージャの接続

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

とアクセス:

namespace Portal\SalesJournalBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

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

ありがとうを返信はすべての接続を使用するために探していますか?上記の例は、1つの接続にのみ固有のようですか?それはうまくいった。 –

関連する問題