[DDC-1209] DateTime (and other custom object types) cannot be used in primary key (singular or composite) Created: 15/Jun/11  Updated: 14/Sep/12  Resolved: 16/Jun/11

Status: Resolved
Project: Doctrine 2 - ORM
Component/s: ORM
Affects Version/s: Git Master
Fix Version/s: 2.1
Security Level: All

Type: Bug Priority: Major
Reporter: Michael Ridgway Assignee: Guilherme Blanco
Resolution: Fixed Votes: 0
Labels: None


 Description   

This bug was encountered using a DateTime type as an @Id, but it appears that it will affect any type of custom data type if it is an object.

Doctrine\ORM\Id\AssignedGenerator checks to see if the key is an object. If so it does a look up in the identity map to find the object, but in the case of DateTime it will not find it and throws an exception. It is appears this is the case for both singular and composite keys as shown in the attached test.

Offending code: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Id/AssignedGenerator.php#L52

Test case forthcoming.



 Comments   
Comment by Michael Ridgway [ 15/Jun/11 ]

Test case: https://github.com/mridgway/doctrine2/blob/DDC-1209/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1209Test.php

Comment by Michael Ridgway [ 16/Jun/11 ]

I posted a fix and it was merged this morning by Guilherme: https://github.com/doctrine/doctrine2/pull/74

Comment by Jonathan Ingram [ 11/Sep/12 ]

I am wondering if this fix is working correctly or has regressed?

I have a YAML file as follows:

 
Acme\Entity\SearchExecution:
    type: entity
    table: search_execution
    id:
        search:
            associationKey: true
        # It seems this is not working
        dateExecuted:
            type: datetime
            column: Date
    fields:
        executionTime:
            type: integer
    manyToOne:
        search:
            targetEntity: Acme\Entity\Search
            joinColumn:
                name: SearchID
                referencedColumnName: id
        user:
            targetEntity: Acme\Entity\User
            joinColumn:
                name: ByUserID
                referencedColumnName: id

So the "dateExecuted" field is used to compose an artificial primary key since the table has no PK.

The error is:

[ErrorException]                                                                                                                                                                                
  Catchable Fatal Error: Object of class DateTime could not be converted to string in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1295

Exception trace:
 () at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1295
 Symfony\Component\HttpKernel\Debug\ErrorHandler->handle() at n/a:n/a
 implode() at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1295
 Doctrine\ORM\UnitOfWork->addToIdentityMap() at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1125
 Doctrine\ORM\UnitOfWork->scheduleForInsert() at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:810
 Doctrine\ORM\UnitOfWork->persistNew() at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1540
 Doctrine\ORM\UnitOfWork->doPersist() at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1501
 Doctrine\ORM\UnitOfWork->persist() at vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:565
 ...

In my composer.json, the relevant versions of Doctrine are:

    {
        {
            "package": "doctrine/common",
            "version": "2.3.0-RC1"
        },
        {
            "package": "doctrine/dbal",
            "version": "2.3.x-dev",
            "source-reference": "239630b61f03f39d198441eced1bfffb7b0e61d1",
            "commit-date": "1346866589"
        },
        {
            "package": "doctrine/orm",
            "version": "2.3.0-RC1"
        },
    }

Is this a bug or am I misusing this?

Comment by Christophe Coevoet [ 13/Sep/12 ]

this has never been supported. Doctrine 2 has always required id fields to be castable as string, which is not the case of a DateTime object

Comment by Jonathan Ingram [ 14/Sep/12 ]

But didn't the PR https://github.com/doctrine/doctrine2/pull/74 get merged in https://github.com/doctrine/doctrine2/commit/98bc3c4e402731fae8716e99c7c19d5e0ff7b60a ? And you can see the use of @Id in the test cases, e.g. https://github.com/doctrine/doctrine2/commit/98bc3c4e402731fae8716e99c7c19d5e0ff7b60a#L2R78 ?

Generated at Wed Nov 26 18:54:19 UTC 2014 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.