0

情况如下:

我有 3 个表(一对多):Product、ProductLabel、LabelTag(保留标签 -_-)

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

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

一些代码:

实体产品:

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

实体标签标签:

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

实体产品标签:

/**
 * @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);

如果我只是呈现表单,我只会看到标签,那些被选中的信息不会被传输(因为它在我管理的中间表中),因此不会显示。

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

4

1 回答 1

0

我终于找到了答案:

只需执行以下操作:

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

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

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

将显示该表单并显示选定的选项。

于 2013-04-04T11:32:24.460 回答