【问题标题】:Doctrine 1.2 hasOne overwrites hasMany RelationDoctrine 1.2 hasOne 覆盖 hasMany 关系
【发布时间】: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 错误?

【问题讨论】:

    标签: php doctrine doctrine-1.2


    【解决方案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 没有设置。
    • 设置后保存了吗?你能更新你的代码吗?
    • 更新了我上面的代码,为了交易安全,我想一次保存整个树。
    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多