Phi*_*ord 14 php postgresql entities symfony doctrine-orm
遵循Doctrine准则,我了解如何为实体设置默认值,但如果我想要日期/时间戳怎么办?
我的问题是我的数据库在字段上有一个默认的NOW()但是当我使用Doctrine插入记录时,值为null或空白但插入的其余部分发生了.
此外,由于Doctrine声称将默认值声明为const,这也会产生问题.
建议?
Phi*_*ord 26
好的我找到了解决方案:
该prePersist选项是我在做什么.
确保在注释中定义
<?php
/** @Entity
* @HasLifecycleCallbacks
*/
class User
Run Code Online (Sandbox Code Playgroud)
这是他们提供的功能示例
/**
* @PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)
如果你像我一样使用ORM
<?php
/** @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class User
Run Code Online (Sandbox Code Playgroud)
这是他们提供的功能示例
/**
* @ORM\PrePersist
*/
public function doStuffOnPrePersist()
{
$this->createdAt = date('Y-m-d H:i:s');
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,最好将所有内容放在您的实体中,而不是试图强制您的数据库绕过ORM.
<?php
namespace Phill\PaffordBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Stack
* @ORM\Table()
*/
class Stack
{
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
* @ORM\Column(type="datetime")
*/
private $startDate;
public function __construct()
{
$this->startDate = new \DateTime();
}
}
Run Code Online (Sandbox Code Playgroud)
为了精确地NOW()进行扩展Doctrine\DBAL\Types\DateTimeType。
其他方法:
class DateTimeNow
{
public function format()
{
return 'NOW()';
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用$entity->setFieldDatetime(DateTimeNow())代替$entity->setFieldDatetime(new Datetime())。
注意:该方法format()由Doctrine自动调用。