Skip to content

Loading…

DDC-1968: CommitOrderCalculator fails to calculate right order for mixing one-to-many and one-to-one relations #2640

Closed
doctrinebot opened this Issue · 7 comments

2 participants

@doctrinebot

Jira issue originally created by user miptpatriot:

I have 2 classes. Zone and Rotator.
Zone relates to Rotator as One-to-Many. And Zone COULD realte to Rotator as One-to-One. Here is code snippet:

class Zone
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @ORM\OneToMany(targetEntity="Rotator", mappedBy="zone", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     * @ORM\OrderBy({"id" = "ASC"})
     */
    private $rotators = array();

    /****
     * @var Rotator $mainRotator
     *
     * @ORM\OneToOne(targetEntity="Rotator")
     * @ORM\JoinColumn(name="mainRotatorId", referencedColumnName="id")
     */
    private $mainRotator;

    /****
     * @var int $mainRotatorId
     *
     * @ORM\Column(name="mainRotatorId", type="integer", nullable="true")
     */
    private $mainRotatorId;
}
class Rotator
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @var Zone $zone
     *
     * @ORM\ManyToOne(targetEntity="Zone")
     * @ORM\JoinColumn(name="zoneId", referencedColumnName="id")
     */
    private $zone;

    /****
     * @var int $zoneId
     *
     * @ORM\Column(name="zoneId", type="integer")
     */
    private $zoneId;
}

When I delete only Zone - calculator works fine. But it fails if I delete entity Site, that relates to Zone as one-to-many (and have a lot of other raltions, so I don't write it here).

As I look through the code, I see CommitOrderCalculator doesn't distiguish mandatory many-to-one relation from optional one-to-one one.

PS this code hadn't been changed since 2.0, so this bug should be reproducable for master.

@doctrinebot

Comment created by @guilhermeblanco:

Your issue is because you have $zone and $zoneId pointing both to an association AND to a field.
Remove the $zoneId field (you can grab it by many different ways) and your issue should be solved.

@doctrinebot

Comment created by @beberlei:

You mention Site? Where is this entity, please make a snippet available as well.

And then, can you show some example object graph that you are trying to delete? This case is data dependent.

@doctrinebot

Comment created by miptpatriot:

class Site
{
    /****
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /****
     * @var \Doctrine\Common\Collections\Collection|SiteAlias[]
     * @ORM\OneToMany(targetEntity="SiteAlias", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $aliases;

    /****
     * @ORM\OneToMany(targetEntity="Zone", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $zones;

    /****
     * @ORM\OneToMany(targetEntity="Banner", mappedBy="site", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
     */
    private $banners;

    /****
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer")
     */
    private $user_id;

    /****
     * @var \Iw\UserBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="\Iw\UserBundle\Entity\User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
}
@doctrinebot

Comment created by miptpatriot:

Is there any fast way to debug output object graph? Like execute print_r somewhere in code.

@doctrinebot

Comment created by ivan1986:

Confirmed
removing ID fields not work

i fix this whis add
* @ORM\JoinColumn(onDelete="cascade")
to child Entity ManyToOne link

OnetoOne Unidirectinal set child after of parent
but OneToMany set set child before of parent (how need)

@doctrinebot

Comment created by @beberlei:

I finally get this issue, and bidirecitonal foreign keys are only deletable with "onDelete=CASCADE", there is absolutely no way for the CommitOrderCalculator to fix this.

@doctrinebot

Issue was closed with resolution "Invalid"

@beberlei beberlei was assigned by doctrinebot
@doctrinebot doctrinebot closed this
@doctrinebot doctrinebot added the Bug label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.