我正在尝试与学说进行双向一对一。
<?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)
答案 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实体。
警告:此解决方案适用于用户始终拥有购物车的情况。
希望这可以帮助遇到类似问题的人。谢谢!