你好,当我想创建新的帖子时,我有Sonata捆绑包的问题
[2/3] DBALException:执行'INSERT INTO post(标题,状态,正文,创建,更新)VALUES(?,?,?,?, ?)'与params [“Hello World”,1,“asdasda”,null,“2014-04-29 18时05分10" 秒]:
SQLSTATE [23000]:完整性约束违规:1048列“已创建” 不能为空
在我的实体类中,我使用 @ORM \ HasLifecycleCallbacks()来创建和更新操作。
实体
use Doctrine\ORM\Mapping as ORM;
/**
* Post
*
* @ORM\HasLifecycleCallbacks()
* @ORM\Table(name="post")
* @ORM\Entity(repositoryClass="ISLab\Bundles\BlogBundle\Entity\PostRepository")
*/
class Post
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var integer
*
* @ORM\Column(name="status", type="integer")
*/
private $status;
/**
* @var string
*
* @ORM\Column(name="body", type="text", nullable=true)
*/
private $body;
/**
* @var datetime
*
* @ORM\Column(name="created", type="datetime")
*/
private $created;
/**
* @var datetime
*
* @ORM\Column(name="updated", type="datetime")
*/
private $updated;
这是我在实体中用于创建和更新的方法。
/*
* Set Date Created
*
* @ORM\PrePersist
*
* @return \DateTime
*/
public function setCreated()
{
return $this->created = new \DateTime(date('Y-m-d H:i:s'));
}
/**
* Get Date Created
*
* @return Post
*/
public function getCreated()
{
return $this->created;
}
/**
* Set Date Modified
*
* @ORM\PrePersist
* @ORM\PreUpdate
*
* @return Post
*/
public function setUpdated()
{
$this->updated = new \DateTime();
return $this;
}
/**
* Get Udated Date
*
* @return Post
*/
public function getUpdated()
{
return $this->updated;
}
更新操作工作正常,当我编辑任何帖子时,他总是自动调用。但是当我尝试创建新帖子时创建的值是null idk whay?
答案 0 :(得分:4)
根据错误消息,插入新实体时created
属性为null
。您必须为此属性设置值。
您可以在Entity类构造函数中设置它:
class Post
{
public function __construct()
{
$this->created = new \DateTime();
}
...
或者您可以在通过调用setCreated()
来保持您的实体之前进行设置。
答案 1 :(得分:1)
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
if ($this->created == null) $this->created = new \DateTime();
}
答案 2 :(得分:1)
Gedmo Doctrine2 extensions为此问题提供了标准解决方案。
以下是相应注释的示例:
<?php
namespace ISLab\Bundles\BlogBundle\Entity;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
/**
* Post
*
* @ORM\Table(name="post")
* @ORM\Entity(repositoryClass="ISLab\Bundles\BlogBundle\Entity\PostRepository")
*/
class Post
{
/**
* @var \DateTime
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(name="created_at", type="datetime")
*/
private $createdAt;
/**
* @var \DateTime
*
* @Gedmo\Timestampable(on="update")
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updatedAt;
/**
* @var \DateTime
*
* @ORM\Column(name="enabled_at", type="datetime", nullable=true)
*/
protected $enabledAt;