ManyToMany关系不会创建所有表

时间:2014-03-12 20:31:23

标签: symfony doctrine-orm

我有两个简单的实体。一个是服务,一个是产品。许多服务可以有很多产品。

例如,service1由product2和product6组成,service2由product1和product2组成,......

我创建了产品实体(id和name),然后创建了具有id,name和的服务实体:

 /**
   * @var ArrayCollection
   *
   * @ORM\ManyToMany(targetEntity="Product", cascade={"persist", "remove"}, mappedBy="service")
   */
   private $products;

但这只生成两个真实的表,一个叫做服务,一个叫做产品。而服务表甚至没有一个叫做产品的领域。

我认为这必须创建另一个名为service_product的表来存储两个表之间的关系。

怎么了?

2 个答案:

答案 0 :(得分:1)

如果您只定义这样的关系而在产品实体中不执行任何其他操作,那么它将无法运作。你在这里定义的只是反面,因为

mappedBy="service"

定义您需要使用的关系的拥有方

inversedBy

此外,我认为Product实体中的属性是命名服务,而不是像mappedBy中那样的服务。

<强>更新

这是一个完全适合我的代码。我在控制台中使用生成器创建了ProductService实体,然后仅在服务实体中添加了ManyToMany行。当我执行doctrine:schema:update --force时,创建了3个表:Product,Service和service_product。

产品实体:

<?php

namespace Test\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


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

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

        return $this;
    }

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

服务实体:

<?php

namespace Test\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Service
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Service
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="Product", cascade={"persist", "remove"})
     */
    private $products;


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

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

        return $this;
    }

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

这些是非常基本的实体。您还应该在Products实体中为products属性添加getter和setter,并且可能在构造函数中将产品声明为ArrayCollection。

答案 1 :(得分:0)

确保您已在两个实体

中同时定义了mappedByinversedBy
//Service.php (Service class)
/**
 * @ORM\ManyToMany(targetEntity="Product", inversedBy="services", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="product_service_table_name")
 */
protected $products;

//Product.php (Product class)
/**
 * @ORM\ManyToMany(targetEntity="Service", mappedBy="products", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="product_service_table_name")
 */
protected $services;

如果要为连接表设置特定名称,您可以按照上面的源中的说明定义它,但要确保名称应该相等