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
+
0
-

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
+
+2
-

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í)