我有两张桌子" RFQ"和#34; RFQitem"。我可以制作可以创建RFQ及其标题描述和金额的表格。我可以创建RFQitem表单,它可以创建RFQitem及其标题,描述和数量。
当我需要升级我的RFQ表单时会出现问题,这样我就可以将RFQitems放入其表中,但需要将其分配给RFQ。
在symfony文档中很棒example这对我来说很有用,但这个例子就是使用任务及其标签。所以任务有多个属性(名称,描述),但标签只有一个名称。
我的RFQItems RFQ实体如下所示:
/**
* @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;
但我知道这是错的,但是我如何与具有多个属性的RFQitem建立ManyToMany关系?
答案 0 :(得分:1)
最好的方法是让你实际做这两个实体,父亲和收集孩子你喜欢的属性,但不要注意Symfony的例子。它是一个理论上的OOP,没有定义关系,所以我将尽最大努力粘贴一个基于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();
}
}
诀窍是在Doctrine中使用这个Collection,然后创建两个Form Type,父类和子类,如下例所示。
TheatherType Formtype包含Work childs:
$buider->add('rowswork', 'collection', array(
'type' => new WorkChildType(),
'allow_add' => true,
'allow_delete' => true,
)
);
因此,有一行的Work子项具有自己的WorkChildType,其中包含实体的属性。它就像一个表单,带有嵌入式项目集合,在您的情况下是" RFQ"父亲形式和" RFQitem"儿童的。