2

我想使用两个外键加上日期时间字段的组合作为我的组合主键。

但我得到一个

可捕获的致命错误:无法将类 DateTime 的对象转换为 C:\development\xampp\htdocs\happyfaces\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php 行 1337 中的字符串

当我这样做的时候。一旦我id: true从我的 YML 实体声明中删除,一切都会再次正常工作。

这里出现什么问题?对我来说,这似乎是一个 Symfony2 或 Doctrine2 错误,因为如果我不将日期时间列声明为主键的一部分,则日期时间在数据库中设置得很好。

任何人都可以提供帮助或建议吗?

4

1 回答 1

8

这是不可能的,也不推荐。对于主键,关注原始数据类型,例如Integeror String。大多数 RDMS 系统更喜欢Integer作为主键以获得最佳性能。

看看:http ://doctrine-orm.readthedocs.org/en/2.1/tutorials/composite-primary-keys.html

也许可以通过添加新的 Doctrine 数据类型来解决问题。有一个__toString()函数,但我认为 Doctrine 会强迫你只使用原始数据类型。

class Foo
{
    private $bar = 'test';

    public function __toString()
    {
        return $this->bar;
    }
}

echo new Foo();

您的错误通常意味着DateTime没有__toString()功能或与字符串不兼容。我从未测试过它使用自定义数据类型作为主键。所以你必须自己尝试一下。

看看:http ://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html

另一种尝试是用String作主键并设置你id

$entity->setId(new \DateTime()->format('yyyy/mm/dd'));

这是一个类似的问题:Symfony/Doctrine: DateTime as primary key

于 2013-09-18T14:15:03.727 回答