Symfony多对多

时间:2013-12-23 08:50:35

标签: symfony doctrine-orm

通常我以一对多的方式解决了多对多的问题: 第一个 - <第二个> - 第三个。代码的实现与本教程中描述的类似: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'表没有在数据库中获取任何数据。

我认为我有一些'特殊'要做,为了让这张桌子充满会员 - 产品关系数据?

1 个答案:

答案 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();

}