我有以下表格:
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;
}
答案 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“免费”)并且不要忘记更新数据库架构