我有两个简单的实体。一个是服务,一个是产品。许多服务可以有很多产品。
例如,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的表来存储两个表之间的关系。
怎么了?
答案 0 :(得分:1)
如果您只定义这样的关系而在产品实体中不执行任何其他操作,那么它将无法运作。你在这里定义的只是反面,因为
mappedBy="service"
定义您需要使用的关系的拥有方
inversedBy
此外,我认为Product实体中的属性是命名服务,而不是像mappedBy中那样的服务。
<强>更新强>
这是一个完全适合我的代码。我在控制台中使用生成器创建了Product
和Service
实体,然后仅在服务实体中添加了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)
确保您已在两个实体
中同时定义了mappedBy
和inversedBy
//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;
如果要为连接表设置特定名称,您可以按照上面的源中的说明定义它,但要确保名称应该相等