[英]Symfony 3.4/Doctrine 2 one-to-one association error
我有两个实体User
和Cart
。 他们应该具有一对一的关联关系,该关联关系由以下内容创建:
user.php的:
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\OneToOne(targetEntity="Cart", mappedBy="user")
*/
private $cart;
// other things not related to the association
}
Cart.php:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Class Cart
* @package AppBundle\Entity
*
* @ORM\Entity
* @ORM\Table(name="Cart")
*/
class Cart
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="cart")
*/
private $user;
// other things not related to the association
}
我创建了购物车,并在某人首次尝试查看其购物车时保留所有实体:
CartController.php:
public function showCartAction()
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
$cart = $user->getCart();
if ($cart) {
$items = $cart->getCartItems();
} else {
$cart = new Cart();
$user->setCart($cart);
$em = $this->getDoctrine()->getManager();
$em->persist($cart);
$em->persist($user);
$em->flush();
$items = $cart->getCartItems();
}
// other unrelated things in the controller
}
这样,就可以创建购物车,但是User
和Cart
之间没有关联:
user_id
应该具有用户的ID。
有什么想法为什么不起作用? 并可以简单地执行以下操作:
public function __construct()
{
$this->cart = new Cart();
}
在我的User
实体中? 这样会加强关联吗? 还是那是错误的路?
您可能要确保在没有用户关联的情况下无法创建购物车。 与字段不同,关联默认为空。 您必须为此添加一个JoinColumn批注。
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="cart")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
另一件事是,由于您具有双向关联,因此必须确保在调用$user->setCart($cart)
这还将用户添加到购物车中,例如:
public function setCart(Cart $cart): void
{
$this->cart = $cart;
$cart->setUser($this);
}
由于没有用户就无法创建购物车,因此您还可以使用户成为构造函数参数:
public function __construct(User $user)
{
$this->user = $user;
$user->setCart($this);
}
这样,您可以在购物setUser()
省略setUser()
方法,以确保没有人意外切换购物车所有者。
对于后者,您可能甚至不必链接回用户,因为购物车是拥有者,但是要确保两个实体都具有一致的状态,当您建立双向关联时,我总是会这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.