10

複数の接続があり、リポジトリ クラスがあります。リポジトリ クラスが複数の接続にアクセスできるようにしたいと考えています。複数のデータベース ホストからデータをフェッチする必要があるレポート用です。

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

私はこれが何か手がかりを与えるかもしれないと思いましたか?エンティティを注入していますが、少し混乱していて、そうであるかどうかわかりませんか?

4

2 に答える 2

12

AnEntityRepositoryは、その所有エンティティ (およびマネージャー) のみに関係する必要があります。そのため、Entity Repositories と Entity Manager を混在させることは、実際には適切ではありません。自分でサービスを作成し、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();
于 2013-03-11T14:17:56.540 に答える
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();
    }
}
于 2013-03-07T22:00:17.840 に答える