Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1359

Deleting and inserting with unique index

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Invalid
    • Affects Version/s: 2.0.7
    • Fix Version/s: None
    • Component/s: ORM
    • Labels:
      None
    • Environment:
      MySQL

      Description

      I'm getting a database error when deleting and inserting records in a single unit of work. Consider this example:

      I have a user and user_info tables. user_info stores additional data about a user as a list of key-values.
      user: id, name, email, password
      user_info: id, user_id, info_key, info_value

      I created a unique index on user_info table: CREATE UNIQUE INDEX `user_info_key` ON `user_info` (`user_id` , `key` ) ;

      Each table is represented as an Entity class.

      Now, I run this code:
      1. $user->removeAllInfo(); // remove old entries
      2. $user->addInfo('first_name', 'John'); // add new entries
      3. $this->em->flush(); // save

      This causes MySQL error: "Integrity constraint violation: 1062 Duplicate entry". Doctrine ORM first persists new entities and then deletes old entities. I think the relevant code is at Doctrine/ORM/UnitOfWork :277-313. Everything works fine if I add flush() before line 2. Also, everything works fine if I change the index to non-unique.

        Activity

        Hide
        Marco Pivetta added a comment -

        Invalid usage of collection API/object graph

        Show
        Marco Pivetta added a comment - Invalid usage of collection API/object graph
        Hide
        Marco Pivetta added a comment -

        I just got back to the UnitOfWork and (in latest master) it executes deletes as last operation (maybe to avoid cascades), and this is also documented.

        In my opinion, you should do the operation of computing the changeset on your `info` collection manually...

        Show
        Marco Pivetta added a comment - I just got back to the UnitOfWork and (in latest master) it executes deletes as last operation (maybe to avoid cascades), and this is also documented. In my opinion, you should do the operation of computing the changeset on your `info` collection manually...

          People

          • Assignee:
            Marco Pivetta
            Reporter:
            Rafal Radulski
          • Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: