2013-05-22 97 views
1

我有以下表格:如何映射两个实体的第三个实体的ID?

user:   id, name, credit_card_id 
credit_card: id, value 
balance:  id, value, credit_card_id 

应该如何看起来像学说映射从User实体获取与用户的CreditCard所有Balance实体?

我试图与OneToMany关系,但没有运气:

class User { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(name="name", type="string", length=255, nullable=true) 
    */ 
    protected $name; 

    /** 
    * @var CreditCard 
    * @ORM\OneToOne(targetEntity="CreditCard", inversedBy="user") 
    * @ORM\JoinColumn(name="credit_card_id", referencedColumnName="id") 
    */ 
    protected $creditCard; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Balance", mappedBy="user") 
    */ 
    protected $balances; 

} 

class Balance { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var float 
    * 
    * @ORM\Column(name="value", type="float") 
    */ 
    protected $value; 


    /** 
    * @var CreditCard 
    * 
    * @ORM\ManyToOne(targetEntity="CreditCard") 
    * @ORM\JoinColumn(name="credit_card_id", referencedColumnName="id") 
    */ 
    protected $creditCard; 

    /** 
    * @var User 
    * 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="balances") 
    */ 
    protected $user; 

} 

class CreditCard 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="value", type="string") 
    */ 
    protected $value; 

    /** 
    * @var User 
    * 
    * @ORM\OneToOne(targetEntity="User", mappedBy="creditCard") 
    */ 
    protected $user; 

} 
+0

你的意思是你想有像 用户 - >卡 - >平衡 吧? –

回答

2

如果CREDIT_CARD被realated给用户,你应该考虑使用户和CREDIT_CARD和CREDIT_CARD和平衡之间的关联。
以这种方式,你可以检索你需要的东西。否则,如果您没有在Balance和Credit_Card之间建立关联(即使我将它看成您的表格表示形式)也不可能通过“直接”(如此通过类成员)来检索。在后一种情况下,您必须编写一个自定义的DQL查询。

更新

你的实体和数据库设计是棘手ORM。一种可能的解决方案(但效率低下,从我的角度来看)是以下

O)取所有用户余额:$balances = $user->getBalances();
O)获取用户信用卡:$cc = $user->getCreditCard();
O)删除AREN”所有余额T“连接”使用信用卡,你已经获取

creditCardBalance = new ArrayCollection(); 
    foreach($balances as $balance) 
    { 
    if($balance->getCreditCard()->getId())= $cc->getId()) 
    { 
     creditCardBalance->add($balance) 
    } 
    } 

的另一种方法(比较有效)是改变你的映射按以下方式

class Balance { 

    /** 
    * @var CreditCard 
    * 
    * @ORM\ManyToOne(targetEntity="CreditCard", inversedBy="balances") 
    */ 
    protected $creditCard; 

} 

class CreditCard 
{ 

    /** 
    * @var Balances 
    * 
    * @ORM\OneToMany(targetEntity="Balance", mappedBy="creditCard") 
    */ 
    protected $balances; 

} 

这样,你就可以直接得到你所需要的,以下列方式

$cc = $user->getCreditCard(); 
$balances = $cc->getBalances(); 

请注意:不要忘记让教义为您的实体(如果你想setter和吸气“免费”),不要忘记更新数据库架构

+0

'User' - 'CreditCard'和'Balance' - 'CreditCard'之间已经存在关系。如果没有自定义DQL,无法获取'Balance'实体吗? – hsz

+0

@hsz:发布你的整个关系,然后我可以更有帮助:) – DonCallisto

+0

好吧,我已经更新了我的问题。 – hsz