0

我在两个实体之间有这个映射:

class Orders {
    // Other attributes 

    /**
     * @ORM\OneToMany(targetEntity="OrderHasProduct", mappedBy="order") 
     */
    protected $orderProducts;

    // Other set/get methods

    public function getOrderProducts()
    {
        return $this->orderProducts;
    }
}

class Product {
    // Other attributes

    /**
     * @ORM\OneToMany(targetEntity="\Tanane\FrontendBundle\Entity\OrderHasProduct", mappedBy="product")
     */
    protected $orderProducts;

    // Other set/get methods

    public function getOrderProducts()
    {
        return $this->orderProducts;
    }
}

当然,由于许多订单可以有许多产品,但还有一个额外的属性,需要这个其他实体:

class OrderHasProduct
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Tanane\FrontendBundle\Entity\Orders")
     * @ORM\JoinColumn(name="general_orders_id", referencedColumnName="id")
     */
    protected $order;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Tanane\ProductBundle\Entity\Product")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    protected $product;

    /**
     * @ORM\Column(type="integer", nullable=false)
     */
    protected $amount;

    public function setOrder(\Tanane\FrontendBundle\Entity\Orders $order)
    {
        $this->order = $order;
    }

    public function getOrder()
    {
        return $this->order;
    }

    public function setProduct(\Tanane\ProductBundle\Entity\Product $product)
    {
        $this->product = $product;
    }

    public function getProduct()
    {
        return $this->product;
    }

    public function setAmount($amount)
    {
        $this->amount = $amount;
    }

    public function getAmount()
    {
        return $this->amount;
    }
}

当我编辑订单时,我应该能够在该订单上添加/删除产品,但我不知道如何实现这一点。我知道我必须使用表单集合,但是如何使用呢?我的意思是一个集合应该嵌入如下:

$builder->add('product', 'collection', array(
    'type' => new OrderHasProductType(),
    'allow_add' => true,
    'allow_delete' => true
));

当我应该创建一个新OrderHasProductType表单时,我想我已经明白了,但我现在的问题是,订单的 ID 会发生什么变化?处理带有额外参数的关系 n:m 的嵌入表单的正确方法是什么?

任何人都可以给我一些代码示例来订购我的想法吗?

额外资源

4

1 回答 1

1

我认为您的情况稍微复杂一点,因为没有与两个实体的标准 Doctrine 多对多关系,而是与三个实体的两个单独的一对多和多对一关系。

通常,对于完整的多对多,该过程将具有例如一个 OrderType 表单,其中包含一个 Collection 字段,该字段充满了 ProductTypes,表示分配给 Order 的产品。

('allow_add' => true意味着如果 Symfony 看到一个没有 ID 的条目,它希望它是通过 Javascript 添加的全新项目,并且很乐意调用表单 Valid 并将新项目添加到实体。'allow_delete' => true相反意味着如果其中一个项目是如果丢失,则 Symfony 会将其从实体中删除。)

但是,您还有更高级别的实体,它是Order->OrderHasProduct->Product。因此,从逻辑上讲,您的 OrderType 表单包含一个 OrderHasProductType 表单的集合(如您在上面所说),而后者又包含一个 ProductType 表单。

所以你的 OrderType 变得更像这样:

$builder->add('orderHasProducts', 'collection', array(
    'type' => new OrderHasProductType(),
    'allow_add' => true,
    'allow_delete' => true
));

您还有另一个级别的产品:

OrderHasProductType

$builder->add('product', 'collection', array(
    'type' => new ProductType(),
    'allow_add' => true,
    'allow_delete' => true
));

还有一个 ProductType:

$builder->add('product', 'entity', array(
    'class' => 'ProductBundle:Product'
));

Symfony 应该很乐意将您的实体映射到正确的类型级别。在您的视图中,您将需要包含 Javascript,这将理解将产品添加到订单还涉及 ProductHasOrder 级别 - 最好将一些数据放入并查看 Symfony 如何将其转换为表单,然后模仿 Javascript 中的结构。

于 2014-09-22T07:50:04.817 回答