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();
однако им нужно иметь возможность запускать его из репозитория. Im получает следующую ошибку
PHP Fatal error: Call to a member function getConnection() on a non-object
Я подумал, что это может дать некоторые подсказки? envinging entities, но я немного запутался и не уверен, что это?
Ответы
Ответ 1
An EntityRepository
должен быть связан только с его владеющим объектом (и менеджером) - поэтому смешивание ваших репозиториев Entity с вашими менеджерами Entity действительно не для того, чтобы идти. Я предлагаю вам создать себе сервис и ввести Doctrine - тогда вы можете запросить все, что захотите. Например:
config
[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();
Ответ 2
вы должны установить диспетчер сущностей, который вы хотите использовать в контроллере, как второй параметр метода getRepository следующим образом:
$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();
}
}