2013-12-23 2 views
1

Обычно я решал много-много случаев способом один-к-одному-к-одному: first - < second> - third. Код реализован, как описано в этом учебнике: http://www.prowebdev.us/2012/07/symfnoy2-many-to-many-relation-with.html и все работает как шарм.Symfony many-to-many

ORM Designer предлагает и простой способ генерации отношений «многие ко многим», и я решил попробовать.

Мои объекты создаются ORM Designer в следующим образом:

Products Entity:

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') 
    ; 
} 

форма сама по себе работает Creat, продукция представлена ​​в списке выбора (на поле «Membershipses») и членство данные сохраняются в базе данных. Но таблица «MembershipsHasProduct» не получает никаких данных в базе данных.

Я предполагаю, что у меня есть что-то особенное, чтобы получить эту таблицу, заполненную данными о соотношении членства и продукта?

+0

Было бы полезно знать, как структурирован продукт с точки зрения атрибутов (как выглядит таблица продуктов в базе данных?). –

+0

Вы имеете в виду необработанный дамп базы данных или файл сущности symfony? – Kpihus

+0

Я имею в виду, например, то же, что и для таблицы принадлежности. SQL-оператор, который используется для создания этой таблицы. –

ответ

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

} 
+0

Похожие добавить в обе стороны? – Kpihus

+0

Только на стороне владельца, иначе у вас будут бесконечные звонки. – shacharsol

Смежные вопросы