Cannot delete a records (OneToMany) with Symfony

1.8k views Asked by At

I have 2 entities linked together PICTURE <-(OneToMany)-> NOTE (see class details below). When I tried to delete a picture record I got the following message from Symfony

An exception occurred while executing 'DELETE FROM Picture WHERE id = ?' with params [118]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (symfony.note, CONSTRAINT FK_6F8F552A8671F084 FOREIGN KEY (picture_id) REFERENCES Picture (id))

I find it strange because if the note.author_id is the same as the current user, then I can delete the picture (and the note associated to the picture) without any problem.

here some details of my class picture and note:

Class Picture
{
   /**
   * @ORM\OneToMany(targetEntity="XXX\XXXBundle\Entity\Note", mappedBy="picture", cascade={"persist", "remove"})
   * @ORM\JoinColumn(name="note_id", referencedColumnName="picture_id", onDelete="CASCADE")
   **/
   private $notes;
}
Class Note
{
   /**
   * @ORM\Id
   * @ORM\ManyToOne(targetEntity="XXX\XXXBundle\Entity\Picture", inversedBy="notes") 
   **/
   private $picture;

   /**
   * @ORM\Id
   * @ORM\ManyToOne(targetEntity="Sdz\UserBundle\Entity\User", cascade={"persist"})
   */
   private $user;
}

Here my controller to delete the picture. FYI picture is a collection in my form. I set the option allow_delete to true

    foreach($pictures as $picture) // $pictures is the initial list of picture
    {  
      if(false === $data_form->getPictures()->contains($picture))
      {
          $em->remove($picture);
      }
    }
1

There are 1 answers

5
Fisher On

You have constraints on database that prevents you from cascaded deleting. I would suggest to use phpMyAdmin tool (mysql command line would be horrible to use for checking constraints): open both tables structure tab, go into relational view, and here check how constraints are set.

You may have different constraints set inside doctrine mappings and inside database, and it may work fine, until you try to perform an action on database, that collides with database constraints, like here.