я не могу получить мою голову вокруг этого:Удаление 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