[DDC-2106] Notice trying to match a Criteria referencing a managed entity not yet persisted Created: 29/Oct/12  Updated: 01/May/13  Resolved: 01/May/13

Status: Resolved
Project: Doctrine 2 - ORM
Component/s: ORM
Affects Version/s: 2.3
Fix Version/s: 2.4
Security Level: All

Type: Bug Priority: Minor
Reporter: Francesc Rosàs Assignee: Benjamin Eberlei
Resolution: Fixed Votes: 0
Labels: None

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();

Comment by Alexander [ 09/Feb/13 ]

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.

Comment by Francesc Rosàs [ 10/Feb/13 ]

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.

Comment by Alexander [ 10/Feb/13 ]

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:

Comment by Francesc Rosàs [ 16/Feb/13 ]

Here you have: https://github.com/doctrine/doctrine2/pull/582

Comment by Benjamin Eberlei [ 01/May/13 ]

Fixed in 2.4

Generated at Tue May 26 15:55:35 UTC 2015 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.