На самом деле вы можете обмануть Doctrine для выполнения запросов к MySQL / MariaDB для соединения между базами данных, просто добавив префикс имени базы данных в аннотации ORM \ Table ваших объектов:
// src/Entity/User.php
@ORM\Table(name="dbname.users")
Это будет использоваться Doctrine во всех операторах SELECT, JOIN.
То, что было сказано, используя это решение, DB_NAME из DATABASE_URL или любые другие значения ваших env-файлов не будут использоваться, что может привести к путанице (поскольку имя базы данных должно быть связано с соединением, а не с сущностью) .
Поскольку вы не можете разрешить динамическое значение в ваших сопоставлениях ORM, таких как "@ORM \ Table (name =% env (DBNAME)%. Users"), но ниже приведен пример использования LoadClassMetadata. событие из Doctrine для динамического выполнения этой работы.
Конструктор класса принимает пространство имен Entities в качестве первого аргумента и имя базы данных в качестве второго аргумента.
Когда Doctrine запускает загрузку метаданных, он запускает метод обратного вызова с классом метаданных для каждой сущности, для которого вы можете динамически обрабатывать и устанавливать имя таблицы из этих значений.
// src/DatabasePrefixer.php
class DatabasePrefixer implements EventSubscriber
{
private $namespace;
private $tablePrefix;
/**
* @param $namespace string The fully qualified entity namespace to add the prefix
* @param $tablePrefix string The prefix
*/
public function __construct($namespace, $tablePrefix)
{
$this->namespace = $namespace;
$this->tablePrefix = $tablePrefix;
}
public function getSubscribedEvents()
{
return ['loadClassMetadata'];
}
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
if ($this->namespace == $classMetadata->namespace) {
$classMetadata->setTableName(sprintf('%s.%s', $this->tablePrefix, $classMetadata->table['name']));
}
}
}
Предположим, что у вас есть переменная env DB_NAME, настройте класс в качестве службы в вашем config / services.yml, используя функции разрешения yaml в Symfony и пометив события для прослушивания правильного события Doctrine:
// config/services.yaml
services:
[...]
dbname.prefixer:
class: App\DatabasePrefixer
arguments:
$namespace: 'App\Entity'
$tablePrefix: '%env(DB_NAME)%'
tags:
- { name: doctrine.event_listener, event: loadClassMetadata, lazy: true }