0

MySQL 表中的列称为“updated_at”。它是日期时间类型,不为空。教义类型也是日期时间。

CREATE TABLE `example` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Some\Bundle\Entity\Example:
    type:            entity
    table:           examples
    fields:
        id:
            id:     true
            type:   integer
            generator:
                strategy: IDENTITY
        ...
        createdAt:
            type:   datetime
            column: created_at
        updatedAt:
            type:   datetime
            column: updated_at

$e = new Example;
$e->setCreatedAt(new \DateTime);
$em->persist($e);
/* after this I need $e->updatedAt to be MySQL's default 0 (0000-00-00) */
$em->flush();
/* but it will throw 
"Integrity constraint violation: 1048 Column 'updated_at' cannot be null" 
if I won't set it in Example::__contruct() 
which I don't see any reason to do 
apart from complying with Doctrine shortcomings. */

如果实体在创建后从未更新,我不想在此列中有任何值。

如何在不更改 MySQL 或 Doctrine 类型的情况下跳过此列或设置适当的值(因为它们是正确的)?

4

2 回答 2

2

两种选择。使用我在评论中提到的时间戳。对于 symfony,它集成在StofDoctrineExtensionsBundle中。然后,您只需将其添加到您的映射 yaml 中,就不需要控制器、服务等中的进一步代码。

选项二:将 设置updated_at为 NULL 而不是 NOT NULL。NOT NULL 表示,必须有一个值(例如,至少 0000-00-00)。如果您在 MySQL 中允许 NULL 值,您将达到您的考虑。

于 2013-05-13T13:24:13.003 回答
0

Doctrine 不能跳过列,使用您在元数据配置中定义的所有字段。

您应该在构造函数中设置一些默认值,空字符串适合几乎所有类型。

它只会在持久化时使用一次,后续提取不会触发构造。

于 2013-07-22T12:12:30.000 回答