2013-05-22 99 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