Связать Entity Manager с Entity в Symfony2?

110
17

У меня есть 2 Bundles в моей Symfony2 Framework: "MainBundle" с User Entity и "TicketBundle" со всем моим Материалом для системы отслеживания проблем. В этом случае важны только объекты "Пул" и "Mappingpooluser". Они оба используют разные сущности, потому что я должен использовать две разные базы данных. (см. ниже мой config.yml)

doctrine:
dbal:
default_connection: default
connections:
default:
[driver, host etc.]
dbname: m_symfony
ticket:
[driver, host etc.]
dbname: m_ticketbundle

orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
XXXMainBundle: ~
ticket:
connection: ticket
mappings:
XXXTicketBundle: ~
XXXMainBundle: ~

Теперь у меня есть Entity (Mappingpooluser), которому требуется одна сущность MainBundle (Пользователь) и один Entity (Pool) TicketBundle (и некоторые несущественные вещи):

/**
* XXX\TicketBundle\Entity\Mappingpooluser
*
* @ORM\Table(name="MappingPoolUser")
* @ORM\Entity(repositoryClass="XXX\TicketBundle\Repository\MappingPoolUserRepository")
*/
class Mappingpooluser
{

/**
* @var integer $poolid
*
* @ORM\OneToOne(targetEntity="Pool")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $pool;

/**
* @var integer $userid
*
* @ORM\OneToOne(targetEntity="XXX\MainBundle\Entity\User")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $user;

[getter/setter and this stuff]

До этого момента все работает нормально :) Я могу получить объект Mappingpooluser в контроллере через

 $em = $this->getDoctrine()->getEntityManager("ticket");
$entities = $em->getRepository('XXXTicketBundle:Mappingpooluser')->findAll();

Если я вызову $ entities [0] → getPool() → getId(), я получу правильный идентификатор пула (как уже упоминалось: пул находится в том же Bundle, что и Mappingpooluser), но если я вызову $ entity [0] → getUser() → getId() Я получу ошибку:

 SQLSTATE[42S02]: Base table or view not found: 1146 Table 'm_ticketbundle.User' doesn't exist 

Thats quit correct, потому что таблица User находится в другом DB (m_symfony).

Long Story, short Вопрос: Как заставить Symfony2 использовать ящик сущностей для билета для пула и пользовательский ящик для пользователя по умолчанию?

спросил(а) 2021-01-25T19:14:28+03:00 5 месяцев назад
1
Решение
89

Фактическая проблема с вашим сценарием заключается в том, что вам нужно сопоставить один и тот же объект (пул) с двумя разными менеджерами сущностей (по умолчанию и билет). В этом сценарии я бы рекомендовал создать иерархию вашего уровня сущности для этого объекта:

    базовый пул, содержит все общие поля пул "default", содержит специализированные поля по умолчанию em пул "билет", содержит специальные поля для билета em

Затем вы можете сопоставить их в разных менеджерах сущностей. Если вы используете два разных пространства имен для объектов по умолчанию и для билета, вы можете указать папку, из которой должны быть загружены сопоставления в вашей конфигурации em, например:

mappings:   
MyBundle:
type: annotation
dir: Path/To/Entities

Путь относится к корневому каталогу Bundles. Так, например, вы могли бы иметь пространства имен Entity/Default и Entity/Ticket и сопоставлять их независимо, имея общие поля в немаркированном классе в пространстве имен Entity.

ответил(а) 2021-01-25T19:14:28+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема