Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-2106

Notice trying to match a Criteria referencing a managed entity not yet persisted

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 2.3
    • Fix Version/s: 2.4
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None

      Description

      Undefined index: (...) in Doctrine/ORM/UnitOfWork.php line 2735
      
      #0 doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(2735): Symfony\Component\HttpKernel\Debug\ErrorHandler->handle(8, 'Undefined index...', '/Users/frosas/S...', 2735, Array) 
      #1 doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php(1696): Doctrine\ORM\UnitOfWork->getEntityIdentifier(Object(MyEntity)) 
      #2 doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php(1683): Doctrine\ORM\Persisters\BasicEntityPersister->getIndividualValue(Object(MyEntity)) 
      #3 doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php(818): Doctrine\ORM\Persisters\BasicEntityPersister->getValue(Object(MyEntity)) 
      #4 doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php(786): Doctrine\ORM\Persisters\BasicEntityPersister->expandCriteriaParameters(Object(Doctrine\Common\Collections\Criteria)) 
      #5 doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php(835): Doctrine\ORM\Persisters\BasicEntityPersister->loadCriteria(Object(Doctrine\Common\Collections\Criteria)) 
      #6 (...): Doctrine\ORM\PersistentCollection->matching(Object(Doctrine\Common\Collections\Criteria)) 
      #7 (...)
      

      As a workaround I had to control this case explicitly:

      if ($myEntity->getId() === null) return null;
      $criteria = Criteria::create()->where(Criteria::expr()->eq('field', $myEntity));
      return $this->collection->matching($criteria)->first();
      

        Activity

        Hide
        Benjamin Eberlei added a comment -

        Fixed in 2.4

        Show
        Benjamin Eberlei added a comment - Fixed in 2.4
        Hide
        Francesc Rosàs added a comment -
        Show
        Francesc Rosàs added a comment - Here you have: https://github.com/doctrine/doctrine2/pull/582
        Hide
        Alexander added a comment -

        If you can create a testcase and send a PR with it that would be very helpful. You can create it and put in in the appropriate class here:
        https://github.com/doctrine/doctrine2/tree/master/tests/Doctrine/Tests/ORM/Functional/Ticket

        Show
        Alexander added a comment - If you can create a testcase and send a PR with it that would be very helpful. You can create it and put in in the appropriate class here: https://github.com/doctrine/doctrine2/tree/master/tests/Doctrine/Tests/ORM/Functional/Ticket
        Hide
        Francesc Rosàs added a comment -

        I'm not sure mapping can help to solve this and is quite a work for me to get it without the client details. Anyway I'll try to reproduce it in a custom scenario if you require it.

        I've been doing some debugging and I got this:

        • It still fails with last 2.3.*@stable
        • Entity is persisted before matching(). At UnitOfWork::persistNew(), $this->entityStates[$oid] is set to self::STATE_MANAGED but $this->entityIdentifiers is untouched ($idGen->isPostInsertGenerator() is true)
        • When BasicEntityProvider::getIndividualValue() is called, $value state is STATE_MANAGED but $uow->getEntityIdentifier() fails because $uow->entityIdentifiers[$oid] was never set.

        Hope it helps.

        Show
        Francesc Rosàs added a comment - I'm not sure mapping can help to solve this and is quite a work for me to get it without the client details. Anyway I'll try to reproduce it in a custom scenario if you require it. I've been doing some debugging and I got this: It still fails with last 2.3.*@stable Entity is persisted before matching(). At UnitOfWork::persistNew(), $this->entityStates [$oid] is set to self::STATE_MANAGED but $this->entityIdentifiers is untouched ($idGen->isPostInsertGenerator() is true) When BasicEntityProvider::getIndividualValue() is called, $value state is STATE_MANAGED but $uow->getEntityIdentifier() fails because $uow->entityIdentifiers [$oid] was never set. Hope it helps.
        Hide
        Alexander added a comment -

        Can you provide us with the mapping of your entities? The code shouldn't get to the point where it asks for the identifier of the object while the object isn't persisted yet.

        Show
        Alexander added a comment - Can you provide us with the mapping of your entities? The code shouldn't get to the point where it asks for the identifier of the object while the object isn't persisted yet.

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Francesc Rosàs
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: