实体字段类型symfony 2.0 - 在编辑操作中显示数据库中的数据

时间:2013-04-04 08:34:17

标签: symfony doctrine-orm symfony-forms

情况如下:

我有3张桌子(一对多): Product,ProductLabel,LabelTag(标签保留-_-)

您可能已经猜到,产品可能有很多标签。

现在我有一个表单产品,显示可用的标签。对于我的新动作和创建动作,我能够显示并保存所选的标签。 当我尝试在数据库的编辑操作中显示标签+显示所选标签时出现问题。

一些代码:

实体产品:

/**
 * @var Doctrine\Common\Collections\ArrayCollection $productLabels
 *
 * @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="product")
 */
protected $productLabels;

实体LabelTag:

/**
 * @var Doctrine\Common\Collections\ArrayCollection $productLabels
 *
 * @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="labelTag")
 */
protected $productLabels;

实体ProductLabel:

/**
 * @var Labeyrie\Bundle\MainsiteBundle\Entity\Product $product
 * 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\Product", inversedBy="productLabels")
 */
protected $product;

/**
 * @var Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag $labelTag
 * 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag", inversedBy="productLabels")
 */
protected $labelTag;

产品表格:

->add('productLabels', 'entity', array(
            'class' => 'LabeyrieMainsiteBundle:LabelTag',
            'property' => 'title',
            'multiple' => true,
            'expanded' => true,
        ))

以下是我在创建操作

中保存的方法
if ($form->isValid()) {
        /* save product */
        $em->persist($product);
        $em->flush();

        /* save product labels */
        $labels = $product->getProductLabels();
        if (!empty($labels)) {
            foreach ($labels as $label) {
                $productLabel = new ProductLabel();
                $productLabel->setLabelTag($label);
                $productLabel->setProduct($product);

                $em->persist($productLabel);
            }
        }
        $em->flush();
    }

没问题。

问题出在我的编辑操作中:

$entity = $em->getRepository('MyProjectBundle:Product')->find($id));   

    $form = $this->createForm(new ProductType(), $entity);

如果我只是渲染表单,我只会看到标签,没有传输哪些标签的信息(因为它在我管理的中间表中),因此没有显示。

我需要使用我的一对多架构来解决这个问题。表单配置错了吗?请帮忙。 :)

1 个答案:

答案 0 :(得分:0)

我终于找到了答案:

只需要执行以下操作:

    $collection = new ArrayCollection();
    $labels = $entity->getProductLabels();
    if (!empty($labels)) {
        foreach ($labels as $label) {
            $collection->add($label->getLabelTag());
        }
    }

    $form->get('productLabels')->setData($collection); 

检索单个对象(LabelTag),将其放入数组集合中,将集合传递给表单字段的数据,然后就完成了。

显示表单并显示所选选项。