Doctrine 1.2 hasOne 覆盖 hasMany 关系
Posted
技术标签:
【中文标题】Doctrine 1.2 hasOne 覆盖 hasMany 关系【英文标题】:Doctrine 1.2 hasOne overwrites hasMany Relation 【发布时间】:2013-01-30 08:28:10 【问题描述】:在一个 Doctrine 1.2 项目中,我们有一个用户
User:
columns:
id:
type: integer(4)
autoincrement: true
primary: true
payment_method:
type: integer(4)
relations:
DefaultPaymentMethod:
class: PaymentMethod
local: payment_method
foreignAlias: Users
foreign: id
type: one
使用他的 PaymentMethods
PaymentMethod:
actAs:
BS_Db_Template_SoftDelete:
columns:
id:
type: integer(4)
primary: true
autoincrement: true
user:
type: integer(4)
relations:
User:
local: user
foreign: id
foreignAlias: PaymentMethods
type: one
如果我尝试设置他的付款方式和默认付款方式中的一种...
$user = new User();
$paymentMethod = new PaymentMethod();
$paymentMethod->set('User',$user);
$user->set('DefaultPaymentMethod',$paymentMethod);
$user->save();
...这一行
$user->set('DefaultPaymentMethod',$paymentMethod);
...删除他的付款方式(因此未设置 PaymentMethod 的用户),当我尝试保存它时。
我做错了什么(逻辑问题)还是 Doctrine 错误?
【问题讨论】:
【参考方案1】:为什么要两次定义付款方式?
PaymentMethod
的外键是 payment_method
。所以,定义一次就OK了。
你可以试试:
$user = new User();
$paymentMethod = new PaymentMethod();
$paymentMethod->setUser($user);
$paymentMethod->save();
$user->setDefaultPaymentMethod($paymentMethod);
$user->save();
set
方法使用关系名称来定义关系。
【讨论】:
我试图一次保存整个对象树,因此我将付款方式附加到用户对象 $user->PaymentMethods[] = $paymentMethod;它适用于此树中的所有其他参考(还有目录、对象、基础、产品)。 但是你不应该同时做这两个,即:$user->PaymentMethods[] = $paymentMethod;
和这个$user->DefaultPaymentMethod = $paymentMethod;
。只选择其中之一。我推荐第二个。
感谢您的努力。我按照您的建议实现了它,并且从 User 到 PaymentMethod 的引用设置为预期的那样。但是 PaymentMethod->User 没有设置。
设置后保存了吗?你能更新你的代码吗?
更新了我上面的代码,为了交易安全,我想一次保存整个树。以上是关于Doctrine 1.2 hasOne 覆盖 hasMany 关系的主要内容,如果未能解决你的问题,请参考以下文章
在 Doctrine 2 继承中覆盖 inversedBy 映射