如何映射id为第三实体的两个实体?

时间:2013-05-22 08:08:20

标签: symfony doctrine-orm entity-relationship

我有以下表格:

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

Doctrine映射应如何从User实体获取与用户的Balance相关的所有CreditCard实体?

我尝试过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;

}

1 个答案:

答案 0 :(得分:2)

如果信用卡与用户相关,则应考虑在用户和credit_card之间以及credit_card和balance之间建立关联。
通过这种方式,你可以找到你需要的东西。否则,如果你没有Balance和Credit_Card之间的关联(即使我在你的表中看到它),也不可能“直接”检索这个(所以通过类成员)。在后一种情况下,您必须编写自定义DQL查询。

<强>更新

您的实体和数据库设计对ORM来说很棘手。可能的解决方案(但从我的观点来看效率低下)是以下

o)获取所有用户余额:$balances = $user->getBalances();
o)获取用户信用卡:$cc = $user->getCreditCard();
o)删除所有未与您提取的信用卡“链接”的余额

   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();

请注意:不要忘记为你生成doctrine生成实体(如果你想让setter和getter“免费”)并且不要忘记更新数据库架构