Symfony2的列不能为空
问题描述:
你好,我已经与索纳塔的问题捆绑时,我想创造新的岗位,我得到消息Symfony2的列不能为空
[2/3] DBALException:在执行“INSERT INTO后(发生异常VALUE(?,?,?,?, ?)'with 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;
}
更新动作工作正常,当我编辑任何帖子时,他总是自动调用。但是,当我尝试创建新的职位创建值为空idk whay?
答
根据错误消息,当插入新实体时,created
属性为null
。您必须为设置此属性的值。
您可以在实体类的构造函数设置:
class Post
{
public function __construct()
{
$this->created = new \DateTime();
}
...
或者,你可以通过调用setCreated()
坚持你的实体面前。
答
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
if ($this->created == null) $this->created = new \DateTime();
}
答
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;