У меня есть две таблицы «RFQ» и «RFQitem». Я могу сделать форму, которая может создать RFQ с описанием и количеством названия. И я могу создать форму RFQitem, которая может создать RFQitem с их названием, описанием и количеством.
Проблемы возникают, когда мне нужно обновить форму RFQ, чтобы я мог создать в ней RFQitems, который будет сохраняться в их таблице, но он должен быть назначен RFQ.
В документации symfony отличный пример, который действительно работает для меня, но это пример с задачей и их тегами. Таким образом, задача состоит из нескольких атрибутов (имя, описание), но теги имеют только одно имя.
Мой объект RFQ с RFQItems выглядит так:
/** * @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) * @ORM\JoinTable(name="rfq_item_title", * joinColumns={@ORM\JoinColumn(name="rfq_item_title", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} * ) */ protected $rfq_item_title; /** * @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) * @ORM\JoinTable(name="rfq_item_description", * joinColumns={@ORM\JoinColumn(name="rfq_item_description", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} * ) */ protected $rfq_item_description; /** * @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) * @ORM\JoinTable(name="rfq_item_amount", * joinColumns={@ORM\JoinColumn(name="rfq_item_description", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} * ) */ protected $rfq_item_amount;
Но я знаю, что это неправильно, но как я могу связать ManyToMany с RFQitem, которые имеют более одного атрибута?
Самый лучший способ – иметь эти два сущности, как вы на самом деле делаете, отец и дети коллекции с атрибутами, которые вам нравятся, но не привязаны к примеру Symfony. Это теоретический ООП, не определивший отношения, поэтому я попытаюсь вставить пример, основанный на коллекции Theater-> Works:
class Theater { private $name; private $id; /** * Set name * @param string $name * @return Theater */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * @return string */ public function getName() { return $this->name; } /** * Get id * @return integer */ public function getId() { return $this->id; } /** * @var \Doctrine\Common\Collections\Collection */ private $work; /** * Constructor */ public function __construct() { $this->work = new \Doctrine\Common\Collections\ArrayCollection(); } /** * Add work * * @param \Acme\RelationBundle\Entity\Work $work * @return Theater */ public function addWork(\Acme\RelationBundle\Entity\Work $work) { $this->work[] = $work; return $this; } /** * Remove work * @param \Acme\RelationBundle\Entity\Work $work */ public function removeWork(\Acme\RelationBundle\Entity\Work $work) { $this->work->removeElement($work); } /** * Get work * @return \Doctrine\Common\Collections\Collection */ public function getWork() { return $this->work; } }
Затем дочерняя организация Работа:
class Work { // took out some comments to make it shorter private $name; private $description; private $id; /** * Set name * @param string $name * @return Work */ public function setName($name) { $this->name = $name; return $this; } /** * Set description : And any others setters/getters with the attributes you want * @param string $description * @return Work */ public function setDescription($description) { $this->description = $description; return $this; } /** * Get name * @return string */ public function getName() { return $this->name; } /** * Get description * @return string */ public function getDescription() { return $this->description; } /** * Get id * @return integer */ public function getId() { return $this->id; } public function __toString() { return (string) $this->getName(); } }
Фокус в том, чтобы использовать эту коллекцию в Доктрине, а затем создать два типа форм, родительский и дочерний, что-то вроде этого примера ниже.
Элемент формы TheatherType содержит дочерние элементы Work:
$buider->add('rowswork', 'collection', array( 'type' => new WorkChildType(), 'allow_add' => true, 'allow_delete' => true, ) );
Таким образом, есть одна строка с их рабочими дочерними элементами, у которых есть свой собственный WorkChildType с атрибутами от объекта. Это как форма со встроенной коллекцией предметов, в вашем случае – форма отчества «RFQ» и дети «RFQitem».