【问题标题】:Binding Entity Manager To Entity in Symfony2?将实体管理器绑定到 Symfony2 中的实体?
【发布时间】:2011-12-29 16:24:46
【问题描述】:

我的 Symfony2 框架中有 2 个捆绑包: 一个带有用户实体的“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),它需要 MainBundle 的一个实体(用户)和 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() 我将得到池的正确 ID(如前所述:池与 Mappingpooluser 位于同一个 Bundle 中),但如果我调用 $entities [0]->getUser()->getId() 我会报错:

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

这是正确的,因为 User 表在另一个 DB (m_symfony) 中。

长话短说 问题:如何让 Symfony2 将票证实体管理器用于池和用户的默认实体管理器??

【问题讨论】:

    标签: doctrine symfony bundle entitymanager


    【解决方案1】:

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

    • 基础池,包含所有常用字段
    • 池“默认”,包含默认 em 的专用字段
    • 池“ticket”,包含ticket em 的专用字段

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

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

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

    【讨论】:

    • 非常感谢,完美运行;拯救了我的一天:)
    猜你喜欢
    • 2012-08-13
    • 2015-09-02
    • 2014-04-01
    • 2012-12-24
    • 2012-09-24
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多