В моем приложении у меня есть объект ZoneMaterial
, который связывает Zone
с набором других объектов. ZoneMaterial
Сущность имеет две коллекции arrayCollections: epis
и epcs
, которые являются другими сущностями. У меня проблема с этими двумя коллекциями.
Связать и отменить связь EPIS
и EPCS
с моим ZoneMaterial
не проблема, но когда я удаляю EPI
или EPC
из моего ZoneMaterial
, я не найду его в следующий раз, когда пойду в мой вид обновления, чтобы связать его снова.
Объект ZoneMaterial
настроен следующим образом:
class ZoneMaterial
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Zone", inversedBy="zoneMaterials")
* @ORM\JoinColumn(name="zone_id", referencedColumnName="id")
*/
private $zone;
/**
* @ORM\ManyToOne(targetEntity="Material")
* @ORM\JoinColumn(name="material_id", referencedColumnName="id")
*/
private $material;
/**
* @ORM\ManyToOne(targetEntity="Outil")
* @ORM\JoinColumn(name="outil_id", referencedColumnName="id")
*/
private $outil;
/**
* @ORM\ManyToOne(targetEntity="Process")
* @ORM\JoinColumn(name="process_id", referencedColumnName="id")
*/
private $process;
/**
* @ORM\ManyToOne(targetEntity="Method")
* @ORM\JoinColumn(name="method_id", referencedColumnName="id")
*/
private $method;
/**
* @ORM\ManyToOne(targetEntity="DustLevel")
* @ORM\JoinColumn(name="dustLevel_id", referencedColumnName="id")
*/
private $dustLevel;
/**
* @ORM\ManyToMany(targetEntity="EPC", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epc",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epc_id", referencedColumnName="id")}
* )
*/
private $epcs;
/**
* @ORM\ManyToMany(targetEntity="EPI", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epi",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epi_id", referencedColumnName="id")}
* )
*/
private $epis;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $deletedAt;
public function __construct(Zone $zone){
$this->epcs = new ArrayCollection();
$this->epis = new ArrayCollection();
$this->setZone($zone);
$this->createdAt = new \DateTime('now');
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
public function getZone()
{
return $this->zone;
}
public function getMaterial()
{
return $this->material;
}
public function getProcess()
{
return $this->process;
}
public function getOutil()
{
return $this->outil;
}
public function setOutil($outil)
{
$this->outil = $outil;
}
public function getMethod()
{
return $this->method;
}
public function getDustLevel()
{
return $this->dustLevel;
}
public function setZone($zone)
{
$this->zone = $zone;
}
public function setMaterial($material)
{
$this->material = $material;
}
public function setProcess($process)
{
$this->process = $process;
}
public function setMethod($method)
{
$this->method = $method;
}
public function setDustLevel($dustLevel)
{
$this->dustLevel = $dustLevel;
}
public function addEpc(EPC $e)
{
$this->epcs[] = $e;
}
public function removeEpc(EPC $e)
{
$this->epcs->removeElement($e);
}
public function getEpcs()
{
return $this->epcs;
}
public function addEpi(EPI $e)
{
$this->epis[] = $e;
}
public function removeEpi(EPI $e)
{
$this->epis->removeElement($e);
}
public function getEpis()
{
return $this->epis;
}
}
Моя форма определяется следующим образом:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('process', EntityType::class , array( 'label' =>'Processus',
'choices_as_values' => true,
'class' => 'AppBundle\Entity\Process',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
}))
->add('material', EntityType::class , array( 'label' =>'Matériau',
'choices_as_values' => true,
'class' => 'AppBundle\Entity\Material',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
}))
->add('method', EntityType::class , array( 'label' =>'Méthode',
'choices_as_values' => true,
'class' => 'AppBundle\Entity\Method',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
}))
->add('outil', EntityType::class , array( 'label' =>'Outil',
'choices_as_values' => true,
'class' => 'AppBundle\Entity\Outil',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
}))
->add('dustLevel', EntityType::class , array( 'label' => "Niveau d'empoussièrement",
'choices_as_values' => true,
'class' => 'AppBundle\Entity\DustLevel',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
}))
->add('epcs', EntityType::class, array( 'label' =>'MPC',
'class' => 'AppBundle\Entity\EPC',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
->add('epis', EntityType::class, array( 'label' =>'EPI',
'class' => 'AppBundle\Entity\EPI',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
;
}
и отображается так:
{{ form_start(form, {'action': path('updt_zone_material', {'id':id}), 'method': 'POST'}) }}
<div class="modal-header">
<h4 class="modal-title" id="smallModalLabel">Matériau lié à la zone</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-sm-12">
{{ form_widget(form) }}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-link waves-effect" data-dismiss="modal">Fermer</button>
<button type="submit" class="btn btn-primary waves-effect">Modifier</button>
</div>
{{ form_end(form) }}
Кажется, все работает нормально, но когда я удаляю EPC
или EPI
из ZoneMaterial
, я не могу вернуть его обратно, потому что он просто исчезает из списка EPI или EPC в моей форме.
Здесь нет фильтра для выбора элемента для формы:
->add('epcs', EntityType::class, array(
'label'=>'MPC',
'class'=>'AppBundle\Entity\EPC',
'query_builder'=>feach time I remove an element from the entity using the form, I wont find it anymore in my formeach time I remove an element from the entity using the form, I wont find it anymore in my formunction ($repository) use ($options) {
return $repository->createQueryBuilder('a')->orderBy('a.name', 'ASC');
},
'multiple'=>true,
Почему каждый раз, когда я удаляю элемент из сущности, используя форму, я больше не найду его в своей форме , чтобы вернуть его в мою сущность?
Вот функция обновления контроллера:
public function updtZoneMaterialAction(Request $request, $id){
$doctrine = $this->getDoctrine();
$zoneMaterial = $doctrine->getRepository(ZoneMaterial::class)->find($id);
$form = $this->createForm(ZoneMaterialType::class, $zoneMaterial);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Persist informations
$entityManager = $doctrine->getManager();
$entityManager->persist($zoneMaterial);
$entityManager->flush();
return $this->redirectToRoute('zone_edit', array(
'id' => $zoneMaterial->getZone()->getId(),
'act' => 'material'
));
}
//Render view
return $this->render('AppBundle:Zone:updt_zone_material.html.twig', array(
'form' => $form->createView(),
'id' => $id
));
}
Нужна помощь