将实体管理器绑定到Symfony2中的实体?

时间:2011-12-29 16:24:46

标签: doctrine symfony bundle entitymanager

我的Symfony2框架中有2个Bundles: 带有用户实体的“MainBundle”,以及带有问题跟踪系统所有东西的“TicketBundle”。在本案例中,只有实体“池”和“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: ~

现在我有一个Entity(Mappingpooluser)需要一个MainBundle实体(User)和一个TicketBundle实体(Pool)(以及一些不重要的东西):

/**
 * 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]

直到这一点一切正常:) 我可以通过

获取Controller中的Mappingpooluser实体
 $em = $this->getDoctrine()->getEntityManager("ticket");
 $entities = $em->getRepository('XXXTicketBundle:Mappingpooluser')->findAll();

如果我调用$ entities [0] - > getPool() - > getId()我将获得池的正确ID(如上所述:Pool与Mappingpooluser在同一个Bundle中),但如果我调用$ entities [0] - > getUser() - > getId()我会收到错误:

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

多数民众赞成退出正确,因为用户表位于其他数据库(m_symfony)中。

长篇故事,简短问题:如何让Symfony2为Pool使用票证实体管理器,为用户使用默认的实体管理器?

1 个答案:

答案 0 :(得分:3)

您的方案的实际问题是您需要将同一实体(池)映射到两个不同的实体管理器(默认和票证)。我在这种情况下建议的是在实体层中为此实体创建层次结构:

  • 基本池,包含所有常用字段
  • pool“default”,包含默认em
  • 的专用字段
  • pool“ticket”,包含故障单em的专用字段

然后,您可以将它们映射到不同的实体管理器中。如果对默认和故障单实体使用两个不同的命名空间,则可以在em配置中指定应从中加载映射的文件夹,如下所示:

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

路径相对于Bundles的根目录。因此,例如,您可以拥有Entity / Default和Entity / Ticket名称空间,并在Entity名称空间中的未映射类中具有公共字段时独立映射它们。