Как создать ассоциативную ссылку «многие ко многим» с дополнительными полями с помощью Doctrine 2?

Идея заключается в следующем: есть продукты просто а также соединение. Соединение продукты могут состоять из нескольких просто продукты, например:

Есть продукт «Коктейль»просто продукт, со своими характеристиками (название, описание, цена и т. д.), и есть соединение продукт — «Фонтан коктейлей» который включает в себя продукт «Коктейль» в качестве основного компонента. Один «Фонтан коктейлей» состоит из 50 «Коктейль».

Прямо сейчас у меня есть Товар сущность, которая имеет многие-ко-многим отношения с автореферентно:

<?php

namespace CT\AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
* Class Product
*
* @ORM\Entity
* @ORM\Table(name="products")
*/
class Product
{
/**
* @ORM\id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;

/**
* @ORM\Column(type="string")
*
* @var string
*/
protected $name;

/**
* @ORM\Column(
*     name="description",
*     type="text"* )
*
* @var string
*/
protected $desc;

/**
* @ORM\Column(type="float")
*
* @var float
*/
protected $price;

/**
* @ORM\Column(
*     name="count_type",
*     type="string"* )
*
* @var string
*/
protected $countType;

/**
* @ORM\Column(
*     name="default_count",
*     type="integer",
*     options={"unsigned": true}
* )
*
* @var int
*/
protected $defCount;

/**
* @ORM\Column(type="boolean")
*
* @var bool
*/
protected $isCountable;

/**
* @ORM\Column(type="boolean")
*
* @var bool
*/
protected $isCompound;

/**
* @ORM\ManyToMany(
*     targetEntity="Product",
*     mappedBy="components"* )
*
* @var ArrayCollection
*/
private $products;

/**
* @ORM\ManyToMany(
*     targetEntity="Product",
*     inversedBy="products"* )
* @ORM\JoinTable(
*     name="compound_products",
*     joinColumns={
*         @ORM\JoinColumn(
*             name="main_product_id",
*             referencedColumnName="id"*         )
*     },
*     inverseJoinColumns={
*         @ORM\JoinColumn(
*             name="component_product_id",
*             referencedColumnName="id"*         )
*     }
* )
*
* @var ArrayCollection
*/
private $components;

/**
* Product constructor.
*/
public function __construct()
{
$this->products = new ArrayCollection();
$this->components = new ArrayCollection();
}

// Getters & setters...
}

Я хочу добавить дополнительное поле количество в compound_products Таблица для задания количества простых продуктов в одном составном продукте, чтобы получить вывод: http://prntscr.com/cgdvc3

Я нашел одно решение, но я не совсем понимаю, как применить его к моей проблеме: Учение многих ко многим самообращающимся с дополнительными колонками

Не могли бы вы объяснить, как я мог бы добавить это дополнительное поле для моей задачи, сохранив отношения многие-ко-многим с помощью самореференции? Или, если у вас есть лучшее решение, вы могли бы поделиться им?

0

Решение

Вам нужно создать отдельную сущность, чтобы связать ваши сущности. Что-то вроде ProductCompound.

А затем дважды свяжите его с вашей сущностью Product для каждого отношения.

/**
* Class ProductCompound
*
* @ORM\Entity
* @ORM\Table(name="compound_products")
*/
class ProductCompound
{
/**
* @ORM\id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;

/**
* @ORM\ManyToOne(
*     targetEntity="Product",
*     inversedBy="products"* )
* @ORM\JoinColumn(name="main_product_id", referencedColumnName="id"*
* @var ArrayCollection
*/
protected $mainProduct;

/**
* @ORM\ManyToOne(
*     targetEntity="Product",
*     inversedBy="components"* )
* @ORM\JoinColumn(name="component_product_id", referencedColumnName="id"*
* @var ArrayCollection
*/
protected $componentProduct;

/**
* @var double
*
* @ORM\Column(name="amount", type="float", nullable=true)
*/
protected $amount;

И изменить продукт:

    /**
* Class Product
*
* @ORM\Entity
* @ORM\Table(name="products")
*/
class Product
{
...

/**
* @ORM\OneToMany(
*     targetEntity="ProductCompound",
*     mappedBy="mainProduct"* )
*
* @var ArrayCollection
*/
private $productLinks;

/**
* @ORM\OneToMany(
*     targetEntity="ProductCompound",
*     mappedBy="componentProduct"* )
*
* @var ArrayCollection
*/
private $componentLinks;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]