2016-09-10 3 views
0

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

Существует продукт «Коктейль» - это простого продукта, со своими характеристиками (название, описание, цена и т.д.), и есть соединение продукт - «Фонтан коктейлей», который включает в себя продукт «Коктейль» в качестве основного компонента. One «Фонтан коктейлей» состоит из 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

Я нашел одно решение, но я не совсем понимаю, как применить его к моей проблеме: Doctrine many to many self referencing with extra columns

Не могли бы вы объяснить мне, как я мог бы добавить дополнительное поле для моей задачи с сохранением отношения МНОГИХ для многих с самореференцией? Или, если у вас есть лучшее решение, вы можете поделиться им?

ответ

1

Вам необходимо создать отдельный объект, который свяжет ваши объекты. Что-то вроде 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; 
+0

Спасибо за совет) Я думал о том же растворе. –

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

  • Нет связанных вопросов^_^