Привязка Entity Manager к сущности в Symfony2? - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть 2 пакета в моей платформе Symfony2: «MainBundle» с пользовательской сущностью и «TicketBundle» со всеми моими материалами для системы отслеживания ошибок. В этом случае важны только сущности "Pool" и "Mappingpooluser". Они оба используют разные менеджеры сущностей, потому что мне нужно использовать 2 разные базы данных. (см. мой 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: ~

Теперь у меня есть сущность (Mappingpooluser), которой требуется одна сущность основного пакета (пользователь) и одна сущность (пул) 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();

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

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

Это правильно, потому что таблица User находится в другой БД (m_symfony).

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

1 Ответ

3 голосов
/ 29 декабря 2011

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

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

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

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

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

...