Smazani ManyToOne entity skončí chybou Kdyby\Doctrine\DBALException
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- ondraondra81
- Člen | 82
Ahoj, jsem z toho jelen a už fakt nevím kudy.
v Article
/**
* @ORM\OneToMany(targetEntity="App\Model\Entities\Image", mappedBy="article", cascade={"all"}, orphanRemoval=true)
* @var Image[] | ArrayCollection()
*
*/
protected $images;
/**
* @param Image $image
*/
public function removeImage(Image $image)
{
if($this->images->contains($image))
{
$this->images->removeElement($image);
}
return $this;
}
V Image
/**
* @ORM\ManyToOne(targetEntity="Article", inversedBy="images", cascade={"all"})
* @ORM\JoinColumn(name="article_id", referencedColumnName="id")
* @var Article
*/
protected $article;
v handleDelete
.....
$this->article->removeImage($image);
$this->em->flush();
....
ale nic se nezmaze
kde je chyba?
navíc nechápu proč se to snaží volat SQL:
DELETE
FROM articles
WHERE id = 6
které musí a skončí chybou:
Kdyby\Doctrine\DBALException
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`externo`.`images`, CONSTRAINT `FK_E01FBE6A7294869C` FOREIGN KEY (`article_id`) REFERENCES `articles` (`id`))
Editoval ondraondra81 (11. 2. 2015 14:21)
- jiri.pudil
- Nette Blogger | 1032
V 1:N mapování je ManyToOne vždycky owning side, takže v
removeImage()
musíš zavolat
$image->setArticle(NULL)
. Druhou část problému by pak imo
mohlo způsobovat nastavení orphanRemoval=true
.
(btw tohle je spíš dotaz do Kdyby fóra nebo ještě lépe Doctrine tagu na SO, anžto s Nette nijak nesouvisí)