繁体   English   中英

Symfony 3.4 / Doctrine 2一对一关联错误

[英]Symfony 3.4/Doctrine 2 one-to-one association error

我有两个实体UserCart 他们应该具有一对一的关联关系,该关联关系由以下内容创建:

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
}

这样,就可以创建购物车,但是UserCart之间没有关联:

在此处输入图片说明

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM