Symfony 2 FOSUserBundle与产品表的关系

时间:2013-11-20 23:22:29

标签: symfony doctrine-orm entity-relationship fosuserbundle

如果之前有人问我,我会事先道歉。

我已成功设置FOSUserBundle。

我正在尝试从文档中的该链接设置“http://symfony.com/doc/current/book/doctrine.html”产品示例。

我想要做的是设置它,以便特定用户添加产品FOSUser的用户ID,该用户与该产品相关联。

我在Acme文件夹中有两个包

Acme / UserBundle - > FOSUser设置

Acme / MainBundle - >我在哪里设置产品。

我已经查看了几次关系文档,我在Symfony2中对它们不太清楚。

我认为用户实体中的OneToMany关系基于Products表中的“user_id”,但我不是100%确定如何做到这一点。

如果我正朝着正确的方向前进,有没有人知道教程甚至基本想法?非常感谢,一旦我到达那里,我显然会公布成功的结果。

2 个答案:

答案 0 :(得分:1)

您只需在用户和产品之间添加关系即可。所以你的产品实体应该是这样的:

<强>的src / Acme公司/ MainBundle /实体/ Product.php

namespace Acme\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;

    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    protected $price;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User", inversedBy="products")
     * @ORM\JoinColumn(name="user_id", nullable=false)
     */
    protected $user;
}

和您的用户实体

<强>的src / Acme公司/ UserBundle /实体/ user.php的

namespace Acme\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Acme\MainBundle\Entity\Product;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{
    /**-
     * User properties...
     */

    /**
     * @ORM\OneToMany(targetEntity="Acme\MainBundle\Entity\Product", mappedBy="user", cascade={"remove"})
     */
    protected $products;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->products = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add product
     *
     * @param Product $product
     * @return Branch
     */
    public function addProduct(Product $product)
    {
        $this->products[] = $product;

        return $this;
    }

    /**
     * Remove product
     *
     * @param Product $products
     */
    public function removeProduct(Product $product)
    {
        $this->products->removeElement($product);
    }

    /**
     * Get products
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getProducts()
    {
        return $this->products;
    }
}

所有内容都在doctrine documentation

中解释

答案 1 :(得分:0)

以下在Symfony 2.3中对我来说非常有效。我从阅读文档和在Symfony2上发布第3集我得到了它我希望它可以帮助某人。

实体
    

use Doctrine\ORM\Mapping as ORM;

use Acme\UserBundle\Entity\User;

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Products
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;

    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    protected $price;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Products
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set price
     *
     * @param float $price
     * @return Products
     */
    public function setPrice($price)
    {
        $this->price = $price;

        return $this;
    }

    /**
     * Get price
     *
     * @return float 
     */
    public function getPrice()
    {
        return $this->price;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Products
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
    * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User", cascade={"remove"})
    * @ORM\JoinColumn(onDelete="CASCADE")
    */
   private $owner;

      public function getOwner()
    {
        return $this->owner;
    }

    public function setOwner(User $owner) 
    {
        $this->owner = $owner; 
    }
}

并在控制器中

 /**
     * Creates a new Products entity.
     *
     */
    public function createAction(Request $request)
    {
        $entity = new Products();
        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();

           // Associate User Entity To Product 
            $user = $this->container->get('security.context')->getToken()->getUser();
            $entity->setOwner($user);

            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('products_show', array('id' => $entity->getId())));
        }

        return $this->render('AcmeMainBundle:Products:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }