Symfony2列不能为空

时间:2014-04-29 16:11:43

标签: symfony doctrine-orm sonata-admin

你好,当我想创建新的帖子时,我有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?

3 个答案:

答案 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;