我的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使用票证实体管理器,为用户使用默认的实体管理器?
答案 0 :(得分:3)
您的方案的实际问题是您需要将同一实体(池)映射到两个不同的实体管理器(默认和票证)。我在这种情况下建议的是在实体层中为此实体创建层次结构:
然后,您可以将它们映射到不同的实体管理器中。如果对默认和故障单实体使用两个不同的命名空间,则可以在em配置中指定应从中加载映射的文件夹,如下所示:
mappings:
MyBundle:
type: annotation
dir: Path/To/Entities
路径相对于Bundles的根目录。因此,例如,您可以拥有Entity / Default和Entity / Ticket名称空间,并在Entity名称空间中的未映射类中具有公共字段时独立映射它们。