通常我以一对多的方式解决了多对多的问题: 第一个 - <第二个> - 第三个。代码的实现与本教程中描述的类似:http://www.prowebdev.us/2012/07/symfnoy2-many-to-many-relation-with.html,一切都像魅力一样。
ORM Designer提供了生成多对多关系的简单方法,我决定尝试一下。
我的实体由ORM Designer以下列方式创建:
产品实体:
class Product {
<....>
/**
* @ORM\ManyToMany(targetEntity="Crm\AdminBundle\Entity\Memberships", inversedBy="Membershipses")
* @ORM\JoinTable(
* name="MembershipsHasProduct",
* joinColumns={@ORM\JoinColumn(name="Product_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="Memberships_id", referencedColumnName="id", nullable=false)}
* )
*/
private $Products;
<....>
}
在数据库中,它看起来像:
CREATE TABLE IF NOT EXISTS `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`eanCode` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`productCode` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`description` longtext COLLATE utf8_unicode_ci,
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`notes` longtext COLLATE utf8_unicode_ci,
`createdTime` datetime NOT NULL,
`virtual` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `IDX_D34A04AD12469DE2` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
会员实体:
class Memberships{
/**
* @ORM\ManyToMany(targetEntity="Crm\StockBundle\Entity\Product", mappedBy="Products", cascade={"all"})
*/
private $Membershipses;
}
在数据库中,它看起来像:
CREATE TABLE IF NOT EXISTS `memberships` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`comembers` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;
MembershipsHasProduct表没有实体symfony,仍然在数据库中生成此表:
CREATE TABLE IF NOT EXISTS `membershipshasproduct` (
`Product_id` int(11) NOT NULL,
`Memberships_id` int(11) NOT NULL,
PRIMARY KEY (`Product_id`,`Memberships_id`),
KEY `IDX_7FF740F6AD9658A` (`Product_id`),
KEY `IDX_7FF740F6CFDFC8A4` (`Memberships_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我使用Symfony的控制台应用程序来自动生成表单,结果就是这样:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('comembers')
->add('Membershipses')
->add('Save','submit')
;
}
表单本身是工作创建者,产品在选项列表中显示(按字段“成员资格”),成员资格数据保存到数据库中。但是'MembershipsHasProduct'表没有在数据库中获取任何数据。
我认为我有一些'特殊'要做,为了让这张桌子充满会员 - 产品关系数据?
答案 0 :(得分:3)
您需要实现以下添加方法:
/**
* {@inheritDoc}
*/
public function addMembership($membership)
{
if (!$this->getMemberhips()->contains($membership)) {
$this->getMemberhips()->add($membership);
$membership->addProduct($this);
}
return $this;
}
并在构造函数上启动成员资格集合:
public function _construct(){
$this->memberships = new ArrayCollection();
}