学说2一对一不按预期工作

时间:2013-12-04 15:38:02

标签: php doctrine-orm doctrine

我正在尝试与学说进行双向一对一。

用户模型

<?php
/**
 * @Entity
 * @Table(name="User")
 */
class User {
  /**
   * @Id
   * @Column(type="integer")
   * @GeneratedValue
   */
  protected $id;

  /**
   * @OneToOne(targetEntity="Cart",mappedBy="user",cascade={"persist"})
   */
  public $cart;

}

购物车型号

<?php
/**
 * @Entity
 * @Table(name="Cart")
 */
class Cart {
  /**
   * @Id
   * @Column(type="integer")
   * @GeneratedValue
   */
  protected $id;

  /**
   * @OneToOne(targetEntity="User",inversedBy="cart")
   * @JoinColumn(name="user_id", referencedColumnName="id")
   */
  public $user;
}

我想像那样设置购物车

<?php
$user->cart = new Cart;
$entityManager->flush();

已创建购物车,但未设置user_id。 (NULL)

怎么了?

(我没有为测试创建getter / setter)

3 个答案:

答案 0 :(得分:3)

所以我做了一些扩展测试,看看可以做些什么。

您的关系代码显示正确无误。我个人会删除连接列注释,因为它无论如何都默认为。

您需要在每个实体中使用getter / setter,例如:

// In User entity
public function setCart(Cart $cart) {
    $this->cart = $cart;
}

// In Cart entity
public function setUser(User $user) {
    $this->user = $user;
}

您还需要执行以下操作:

$user = new User();
$em->persist($user);

$cart = new Cart();
$cart->setUser($user);
$em->persist($cart);

$user->setCart($cart);

$em->flush();

使用此代码段我可以将两个关系保存到数据库并再次加载它们。 The documentation specifically states具有级联的新所有者不会级联。

  

“Doctrine 2不会将持久化操作级联到所有嵌套操作   也是新的实体。“

在我的示例中,我专门设置并保留了两个新项目。有新级联孩子的现有父母没有这个问题。

希望您可以使用此信息确切地知道需要更改的内容。

答案 1 :(得分:0)

简化:

您需要在每个实体中使用getter / setter,例如:

// In User entity
public function setCart(Cart $cart) {
    $this->cart = $cart;
}

// In Cart entity
public function setUser(User $user) {
    $user->setCart($this);
    $this->user = $user;
}

您还需要执行以下操作:

$user = new User();
$em->persist($user);

$cart = new Cart();
$cart->setUser($user);
$em->persist($cart);

$em->flush();

此过程“$ user-&gt; setCart($ cart);”被推销到购物车中的用户设定者;

答案 2 :(得分:0)

这是一个非常古老的问题,但我遇到了类似的问题,并找到了另一种替代kinghfb的方法。您还可以在反面的实体上执行以下操作(如果是此问题,则为用户)。

/**
 * User's Constructor
 */
public function __construct()
{
    $this->cart= new Cart();

    $this->cart->setUser($this);
}

请注意,您需要按照接受的答案建议使用getter和setter,但在执行上述操作后,每次保存User时都不需要创建并保留Cart实体。

警告:此解决方案适用于用户始终拥有购物车的情况。

希望这可以帮助遇到类似问题的人。谢谢!