代码之家  ›  专栏  ›  技术社区  ›  Major Productions

Symfony 3.4/2原则一对一关联错误

  •  0
  • Major Productions  · 技术社区  · 7 年前

    我有两个实体- User Cart .他们应该有一个一对一的关联,由以下内容创建:

    使用者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
    }
    

    运货马车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
    }
    

    有了它,就可以创建手推车,但两者之间没有关联 使用者 运货马车 :

    enter image description here

    user_id 应该有用户的id。

    你知道为什么这样不行吗?有没有可能简单地做如下事情:

    public function __construct()
    {
        $this->cart = new Cart();
    }
    

    在我的 使用者 实体这会强化协会吗?还是走错了路?

    0 回复  |  直到 7 年前
        1
  •  1
  •   dbrumann    7 年前

    您可能希望确保在没有用户关联的情况下无法创建购物车。与字段不同,关联在默认情况下可以为空。你必须添加一个 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() 方法,确保没有人意外切换车主。

    对于后者,您甚至可能不必链接回用户,因为购物车是拥有方,但为了确保两个实体具有一致的状态,当您具有双向关联时,我将始终这样做。

    推荐文章