2016-11-04 2 views
1

я не могу получить мою голову вокруг этого:Удаление jointable запись только в доктрине ManyToMany

Я последовал примеру Symfony поваренной книги, объясняющие, как бороться с ArrayCollections в фреймворка формах: link

Я только изменил «задачи» и «теги» на «концертах» и «художниках». Все работает отлично, я могу добавить исполнителей на концерты, итоговая таблица соединений выглядит отлично. , но когда дело доходит до удаления исполнителя, доктрина не пытается удалить запись в таблице соединений, как предполагалось, но пытается установить имя исполнителя в значение null, которое в любом случае не работает и не работает. Я хочу сохранить художника, но удаляю связь с концертом. поэтому я справлялся с тем, что продолжал себя и не пользовался {cascade}}.

что я делаю неправильно?

Надеюсь, мой вопрос сформирован достаточно хорошо, и я предоставил достаточно информации. Я попытался найти эту проблему, но не смог найти решение.

спасибо

просто

ошибка:

An exception occurred while executing 'UPDATE artist SET name = ? WHERE id = >?' with params [null, 10]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot >be null

gig.php:

/** 
* @var \Doctrine\Common\Collections\ArrayCollection|Artist[] 
* 
* @ORM\ManyToMany(targetEntity="GoetzBundle\Entity\Artist", inversedBy="gigs"), 
* @ORM\JoinTable(name="gigs_artits") 
*/ 
private $artists; 

... 

/** 
* @return ArrayCollection|Artist 
*/ 
public function getArtists() 
{ 
    return $this->artists; 
} 

/** 
* @param Artist $artist 
* @return ArrayCollection|Artist 
*/ 
public function addArtist($artist) 
{ 
    $artist->addGig($this); 
    $this->artists->add($artist); 

    return $this->artists; 
} 

/** 
* @param Artist $artist 
* @return ArrayCollection|Artist 
*/ 
public function removeArtist($artist) 
{ 
    $artist->removeGig($this); 
    $this->artists->removeElement($artist); 

    return $this->artists; 
} 

artist.php

/** 
* @var \Doctrine\Common\Collections\ArrayCollection|Gig[] 
* 
* @ORM\ManyToMany(targetEntity="GoetzBundle\Entity\Gig", mappedBy="artists", fetch="EAGER") 
* 
*/ 
private $gigs; 

... 

/** 
* @param Gig $gig 
* @return ArrayCollection|Gig 
*/ 
public function addGig(Gig $gig) 
{ 
    if (!$this->gigs->contains($gig)) { 
     $this->gigs->add($gig); 
    } 
    return $this->gigs; 
} 

/** 
* @param Gig $gig 
* @return ArrayCollection|Gig 
*/ 
public function removeGig(Gig $gig) 
{ 
    if ($this->gigs->contains($gig)) { 
     $this->gigs->removeElement($gig); 
    } 
    return $this->gigs; 
} 

gigtype.php

... 

$builder 
     ->add('artists', CollectionType::class, array(
      'entry_type' => ArtistType::class, 
      'allow_add' => true, 
      'by_reference' => false, 
      'allow_delete' => true, 
     )) 

... 

gigcontroller.php

public function newAction(Request $request) 
{ 
    $gig = new Gig(); 

    $form = $this->createForm('GoetzBundle\Form\GigType', $gig); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     foreach ($gig->getArtists() as $artist){ 
      $em->persist($artist); 
     } 

     $em->persist($gig); 
     $em->flush(); 

     return $this->redirectToRoute('gig_show', array('id' => $gig->getId())); 
    } 

    return $this->render('@Goetz/gig/new.html.twig', array(
     'gig' => $gig, 
     'form' => $form->createView(), 
    )); 
} 

... 

public function editAction(Request $request, Gig $gig) 
    { 
     $deleteForm = $this->createDeleteForm($gig); 

     $em = $this->getDoctrine()->getManager(); 
     $gig = $em->getRepository('GoetzBundle:Gig')->find($gig); 

     $originalArtists = new ArrayCollection(); 

     foreach ($gig->getArtists() as $artist){ 
      $originalArtists->add($artist); 
     } 

     $editForm = $this->createForm('GoetzBundle\Form\GigType', $gig); 
     $editForm->handleRequest($request); 

     if ($editForm->isSubmitted() && $editForm->isValid()) { 

      foreach ($originalArtists as $artist){ 
       if (false === $gig->getArtists()->contains($artist)){ 
        $artist->getGigs()->removeElement($gig); 
       } 
       $em->persist($artist); 
      } 

      $em = $this->getDoctrine()->getManager(); 

      foreach ($gig->getArtists() as $artist){ 
       $em->persist($artist); 
      } 

      $em->persist($gig); 
      $em->flush(); 

      return $this->redirectToRoute('gig_edit', array('id' => $gig->getId())); 
     } 

     return $this->render('Goetz/gig/edit.html.twig', array(
      'gig' => $gig, 
      'edit_form' => $editForm->createView(), 
      'delete_form' => $deleteForm->createView(), 
     )); 
    } 

edit.html.twig

{% block content %} 
    <h1>Gig edit</h1> 

    {{ form_start(edit_form) }} 
    <h3>Artists</h3> 
    <ul class="artists" data-prototype="{{ form_widget(edit_form.artists.vars.prototype)|e('html_attr') }}"> 
     {% for artist in edit_form.artists %} 
      <li>{{ form_row(artist.name) }}</li> 
     {% endfor %} 
    </ul> 
     {{ form_rest(edit_form) }} 
     <input type="submit" value="Edit" /> 
    {{ form_end(edit_form) }} 

    <ul> 
     <li> 
      <a href="{{ path('gig_index') }}">Back to the list</a> 
     </li> 
     <li> 
      {{ form_start(delete_form) }} 
       <input type="submit" value="Delete"> 
      {{ form_end(delete_form) }} 
     </li> 
    </ul> 
{% endblock %} 
{% block javascripts %} 
    {{ parent() }} 
    <script type="text/javascript" src="{{ asset('bundles/goetz/js/artists.js') }}"></script> 
{% endblock %} 

(новый выглядит так же)

artists.js

ответ

0

Как выглядит действие по удалению?

Не могли бы вы сделать что-нибудь подобное?

public function deleteAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $gig = $this->getDoctrine() 
     ->getRepository('GoetzBundle\Entity\Gig') 
     ->findOneById($id); 

    ... 

    foreach ($gig->getArtists() as $artist) { 
     $gig->removeArtist($artist); 
    } 

    $em->persist($gig); 
    $em->flush(); 

    ... 
} 

Это должно содержать концерт и соответствующие исполнители и удалять соединения между ними в таблице соединений.