У меня есть это отображение между двумя объектами:
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
форма, и я думаю, что я понимаю до этого момента, но мой вопрос сейчас, что происходит с идентификатором заказа? Как правильно обрабатывать вложенную форму отношения n: m с дополнительными параметрами?
Может ли кто-нибудь дать мне пример кода, чтобы заказать мои идеи?
Дополнительные ресурсы
Я думаю, что ваша ситуация несколько усложняется тем, что у вас нет стандартных отношений «многие ко многим» в доктрине с двумя сущностями, а есть два отдельных отношения «один ко многим» и «многие к одному» с тремя сущностями.
Как правило, с полным числом «многие ко многим» процесс должен иметь, например, форму OrderType, содержащую поле Collection, заполненное ProductTypes, представляющим Товары, назначенные Заказу.
('allow_add' => true
означает, что если Symfony видит запись без идентификатора, он ожидает, что это будет совершенно новый элемент, добавленный через Javascript, и с удовольствием вызовет форму Valid и добавит новый элемент в Entity. 'allow_delete' => true
и наоборот означает, что если один из элементов отсутствует, Symfony удалит его из сущности.)
Тем не менее, у вас есть еще один уровень сущностей, это идет Order->OrderHasProduct->Product
, Таким образом, логически ваша форма OrderType содержит форму Collection of 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 должен быть рад сопоставить ваши сущности с правильным уровнем типов. В вашем View вам нужно будет включить Javascript, который будет понимать, что добавление продукта в заказ также включает уровень ProductHasOrder — лучше всего поместить некоторые данные и посмотреть, как Symfony превращает их в форму, а затем имитировать структуру в Javascript.
Других решений пока нет …