嵌入一​​系列形式 - 教义,symfony

时间:2014-10-21 21:30:28

标签: php symfony doctrine-orm

我有两张桌子" 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关系?

1 个答案:

答案 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"儿童的。