2014-10-21 7 views
0

У меня есть две таблицы «RFQ» и «RFQitem». Я могу сделать форму, которая может создать RFQ с описанием и количеством названия. И я могу создать форму RFQitem, которая может создать RFQitem с их названием, описанием и количеством.Вставить коллекцию форм - доктрина, symfony

Проблемы возникают, когда мне нужно обновить форму запроса, чтобы я мог создать в ней RFQitems, который будет сохраняться в их таблице, но он должен быть назначен RFQ.

В документации на symfony замечательно example, которая на самом деле работает для меня, но это пример с задачей и их тегами. Таким образом, задача состоит из нескольких атрибутов (имя, описание), но теги имеют только одно имя.

Моя сущность Объявление с 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, которые имеют более одного атрибута?

ответ

1

Лучший способ пойти в том, чтобы иметь эти два сущности, как вы на самом деле делаете, отец и дети коллекции с атрибутами, которые вам нравятся, но не привязаны к примеру Symfony. Это теоретическая ООП, не определены отношения, так что я собираюсь сделать мой лучший попробовать, чтобы вставить когерентный пример, основанный на> Работает театр-коллекция:

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 Formtype включает в себя работу Чайлдс:

  $buider->add('rowswork', 'collection', array(
       'type' => new WorkChildType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
      ) 
     ); 

Так есть один ряд с их работой Чайлдс, которые имеют свои собственные WorkChildType с атрибутами из сущности. Это как форма со встроенной коллекцией предметов, в вашем случае - форма отчества «RFQ» и дети «RFQitem».

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