2014-04-29 22 views
3

你好,我已经与索纳塔的问题捆绑时,我想创造新的岗位,我得到消息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?

回答

4

根据错误消息,当插入新实体时,created属性为null。您必须为设置此属性的值。

您可以在实体类的构造函数设置:

class Post 
{ 
    public function __construct() 
    { 
     $this->created = new \DateTime(); 
    } 
    ... 

或者,你可以通过调用setCreated()坚持你的实体面前。

1
/** 
* @ORM\PrePersist() 
*/ 
public function prePersist() 
{ 
    if ($this->created == null) $this->created = new \DateTime(); 
} 
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; 
相关问题