在object中设置createdAt timestamp / datetime最干净的方法

时间:2017-05-05 11:27:03

标签: php symfony class doctrine

我已经有过几次这个问题了,我从来不确定最好/最干净的方法来处理它。我想在Symfony类/对象中创建一个createdAt(timestamp / datetime)字段。我知道有几种方法可以处理它,但我想问一下是否有一个最干净的"这样做的方法。

选项1:在构造函数中创建(当前最喜欢的)

public function __construct()
{
    $this->createdAt = new \DateTime();
}

我最喜欢这个,因为它是明确的,它是在"构建"中设置的。

如果我通过存储库从数据库中获取实体,那么连接的问题是,是否会调用构造函数(即调用new \DateTime()后直接用数据库值覆盖?)

选项2:课程中的默认值

class MyClass {

    protected $createdAt = new \DateTime();

    /** ... */
}

我想这很好吗?

选项3:生命周期回调

/**
 * @PrePersist
 */
public function onPrePersistCreated()
{
    $this->createdAt = new \DateTime();
}

我发现它有点不雅,因为它有点副作用,但也许没问题。另一个缺点是我必须等待它被持久化到数据库才能获得createdAt

类似的是使用DoctrineExtensions' Timestampable

选项4:数据库中的默认值

在Symfony类Doctrine注释中,您可以为$createdAt设置默认值,但我觉得这有点不稳定。像

这样的东西
/**
* @var \DateTime
* @ORM\Column(name="created_at", type="datetime", options={"default" : "CURRENT_TIMESTAMP"})
*/

(没有测试代码,可能需要"NOW()"?)但这更依赖于数据库。

所以我的问题是,这是最干净的方式还是依赖于案例?

1 个答案:

答案 0 :(得分:0)

选项1和3有效,2不可能,4很难实现。

  

如果我通过存储库从数据库中获取实体,那么   构造函数永远被调用(即new \ DateTime()被调用   直接用数据库值覆盖)?

从数据库中获取实体时不调用构造函数,doctrine使用Proxy对象并在加载实体时覆盖构造函数。然后构造函数只在第一次创建实体时调用一次。