2014-09-17 2 views
0

У меня есть это отображение betwenn два сущностей:Редактирование формы для отношений п: м с дополнительными атрибутами между двумя сущностями

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; 
    } 
} 

Когда я изменить заказ, я должен иметь возможность добавлять/удалять продукты на таком порядке, но я не знаю, как этого добиться. Я знал, что должен использовать form collection, но как? Я имею в виду сборник следует вставлять следующим образом:

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

Когда я должен создать новую OrderHasProductType формы, и я думаю, что я не понимаю, до этого момента, но мой вопрос теперь, что происходит с ID заказом? Каков надлежащий способ обработки встроенной формы отношения n: m с дополнительными параметрами?

Может ли кто-нибудь дать мне пример кода, чтобы заказать мои идеи?

Дополнительные ресурсы

+0

Вместо «продукта» у вас будет «заказ продукции». OrderHasProductType, в свою очередь, добавил бы («продукт», новый ProductType(). Это может сбивать с толку. – Cerad

+0

@Cerad вы можете оставить какой-то пример кода? – ReynierPM

ответ

1

Я думаю, что ваша ситуация немного осложняется наличием не стандарт Доктрина «многие ко многим» с двумя сущностями, но две отдельные отношения «один ко многим» и «многие к одному» с тремя сущностями.

Обычно, с полным многими-многими, процесс должен иметь, например, форму OrderType, содержащую поле Collection, полное ProductTypes, представляющее Продукты, назначенные для заказа.

('allow_add' => true означает, что если Symfony видит запись без идентификатора ожидает, что это будет совершенно новый элемент, добавленный с помощью Javascript, и счастлив назвать форму Действителен и добавить новый элемент в Entity. '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.

 Смежные вопросы

  • Нет связанных вопросов^_^