2011-12-29 80 views
0

我有2捆在我的Symfony2框架: A「MainBundle」與用戶實體,而「TicketBundle」用我所有的東西的問題跟蹤系統。在這種情況下,只有實體「池」和「映射池用戶」很重要。 他們都使用不同的實體管理器,因爲我必須使用2個不同的數據庫。 (見下面我config.yml)將實體管理器綁定到Symfony2中的實體?

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的MainBundle(用戶)和一個實體(池)的一個實體(和一些不重要的東西):

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

直到此時一切正常:) 我可以通過

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

如果我調用$在控制器獲取Mappingpooluser實體實體[0] - > getPoo如果我調用$ entities [0] - > getUser() - > getId(),我將得到池的正確ID(如上所述:Pool在像Mappingpooluser相同的Bundle中)我會得到一個錯誤:

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

那不幹正確的,因爲用戶表在其他數據庫(m_symfony)。

說來話長,總之問:我如何獲得Symfony2中使用的車票實體管理器爲池和默認實體管理器爲用戶?

回答

3

與您的情況,實際問題是,你需要映射同一實體(池),以兩個不同的實體管理器(默認和門票)。我會建議在這種情況下被創建在這個實體的實體層層次:

  • 基地池,包含了所有常見的領域
  • 池「默認」,包含了默認的EM
  • 游泳池專業領域「門票」,包含專門用於門票的字段em

然後,您可以將它們映射到不同的實體管理器中。如果您使用的默認和門票實體的兩個不同的命名空間,你可以指定從中映射應該在EM配置加載這樣的文件夾:

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

的路徑是相對於捆綁的根目錄。因此,例如,您可以在Entity名稱空間的未映射類中具有公共字段的同時,擁有Entity/Default和Entity/Ticket名稱空間並獨立映射它們。

+0

非常感謝,完美的作品;拯救了我的一天:) – 2015-09-11 15:37:28