1

我有以下表格:

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

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

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

}
4

1 回答 1

2

如果一个 credit_card 被关联到一个用户,你应该考虑在 user 和 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();

请注意:不要忘记让学说为您生成实体(如果您想要 setter 和 getter “免费”)并且不要忘记更新数据库模式

于 2013-05-22T09:27:30.440 回答