я использую Учение 2 (без Zend и Symfony) для доступа два разные Базы данных MySQL в мой проект.
Я пытался создать два EntityManager для каждой базы данных одна. Два загрузочные файлы настроены использовать свои собственные классы, которые расположены в ГРЦ-папка. Они есть обратный инжиниринг с «orm: convert-mapping —from-database» и «orm: generate-entity —generate-annotations = true» и подтверждено с помощью «orm: validate-schema».
Но загрузочные файлы использовать то же самое autoload.php Конфигурация, которая находится в продавец-папка, где композитор а также Учение 2 установлены.
composer.json файл находится в папке проекта.
В настоящее время только последняя сгенерированная схема «EntitiesAnlagenAnalyse» работает, в то время как первая сгенерированная схема «EntitiesPreisAnalyse» производит ошибка:
«Doctrine \ Common \ Persistence \ Mapping \ MappingException» с сообщением
«Класс« Артикель »не существует» в
ProjectDir \ поставщика \ доктриной \ Common \ Lib \ Doctrine \ Common \ Постоянство \ Mapping \ MappingException.php: 96# 1 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ RuntimeReflectionService.php (41):
Доктрина \ Common \ Постоянство \ Mapping \ MappingException :: nonExistingClass ( ‘Код’)# 2 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (281):
Доктрина \ Common \ Постоянство \ Mapping \ RuntimeReflectionService-> getParentClasses ( ‘Код’)# 3 ProjectDir \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ AbstractClassMetadataFactory.php (311):
Доктрина \ Common \ Постоянство \ Mapping \ AbstractClassMetadataFactory-> getParentClasses ( ‘Код’)# 4 ProjectDir \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Mapping \ ClassMetadataFactory.php (78):
Учение \ Общее \ П в
ProjectDir \ поставщика \ доктриной \ Common \ Lib \ Doctrine \ Common \ Постоянство \ Mapping \ MappingException.php
по линии 96
Для детального ознакомления с моей структурой проекта: картина иерархии
{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-0":
{
"": ["EntitiesAnlagenAnalyse/src/", "EntitiesPreisAnalyse/src/"]
}
}
}
<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
require_once(__DIR__."/../vendor/autoload.php");
// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode, null, null, false);
$config->setProxyDir(__DIR__."/proxies");
// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'user' => '****',
'password' => '****',
'dbname' => '****',
);
// obtaining the entity manager
$AnlagenAnalyseManager = EntityManager::create($conn, $config);
<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
require_once(__DIR__."/../vendor/autoload.php");
// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode, null, null, false);
$config->setProxyDir(__DIR__."/proxies");
// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'user' => '****',
'password' => '****',
'dbname' => '****',
);
// obtaining the entity manager
$PreisAnalyseManager = EntityManager::create($conn, $config);
Если я пытаюсь использовать второй EntityManager «PreisAnalyse» сейчас, кажется, что он использует отображение «EntitiesAnlagenAnalyse», потому что он пытается получить столбец «t0.bezeichnung», который находится только в классе «Artikel» в «EntitiesAnlagenAnalyse». Но он запрашивает правильную базу данных, где «bezeichnung» не существует.
ИНФОРМАЦИЯ: Некоторые классы имеют одинаковое имя в обоих менеджерах. Таким образом, в обоих EntitiyManager’ах есть таблица Artikel.
с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 столбец неизвестен
‘t0.bezeichnung’ в ‘списке полей’ ‘в
ProjectDir \ поставщика \ доктрина \ DBAL \ Lib \ Doctrine \ DBAL \ Driver \ PDOConnection.php: 104# 0
ProjectDir \ поставщика \ доктрина \ DBAL \ Lib \ Doctrine \ DBAL \ Driver \ PDOConnection.php (104):
PDO-> query (‘SELECT t0.artik …’)# 1
ProjectDir \ поставщика \ доктриной \ DBAL \ Lib \ Doctrine \ DBAL \ connection.php (833):
Doctrine \ DBAL \ Driver \ PDOConnection-> query (‘SELECT t0.artik …’)# 2
ProjectDir \ поставщика \ доктриной \ ORM \ Lib \ Doctrine \ ORM \ Persisters \ Entity \ BasicEntityPersister.php (884):
Doctrine \ DBAL \ Connection-> executeQuery (‘SELECT t0.artik …’, Array,
Array)# 3
ProjectDir \ поставщика \ доктрина \ ORM \ Lib \ Doctrine \ ORM \ EntityRepository.php (181):
Учение \ ORM \ Persisters \ Entity \ BasicEntityPersister-> Loadall (Array,
NULL, NULL, NULL)# 4
ProjectDir \ поставщика \ доктрина \ ORM \ Lib \ Doctrine \ ORM \ EntityRepository.php (164):
Doctrine \ ORM \ EntityRepository- в ProjectDir \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Driver \ AbstractMySQLDriver.php
по линии 71
Теперь я попытался переключить строки в массиве автозагрузчика PSR-0, и он работает для «PreisAnalyseManager» и «AnlagenAnalyseManger», но только до тех пор, пока не достигнет запроса с классом «Artikel». Так что это определенно проблема с автозагрузчиком, и новый вопрос:
Как я могу определить пространства имен в автозагрузчике, чтобы доктрина правильно использовала его?
{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-0":
{
"": ["EntitiesPreisAnalyse/src/", "EntitiesAnlagenAnalyse/src/"]
}
}
}
решение должен был использовать PSR-4 автопогрузчик вместо из PSR-0 и как Садок-е сказал в комментариях ниже моего вопроса, я добавил конкретные пространства имен и, наконец, пришел к этому composer.json:
{
"require": {
"doctrine/orm": "*"},
"autoload": {
"psr-4":
{
"Preis\\": "EntitiesPreisAnalyse/src/",
"Anlagen\\": "EntitiesAnlagenAnalyse/src/"}
}
}
Других решений пока нет …