Doctrine:不要插入所有字段,只插入非NULL字段

时间:2014-12-12 08:30:15

标签: php symfony triggers doctrine

我有实体

My\Bundle\Entity\Service:
    type: entity
    table: SERVICE
    fields:
        idService:
            id: true
            type: integer
            unsigned: false
            nullable: false
            column: ID_SERVICE
            generator:
                strategy: IDENTITY
        codeService:
            type: string
            length: 5
            fixed: false
            nullable: false
            column: CODE_SERVICE
        dateCreation:
            type: date
            nullable: false
            column: DATE_CREATION
        dateModification:
            type: date
            nullable: false
            column: DATE_MODIFICATION

在我的数据库中,我有一个设置dateCreation和dateModification的BEFORE INSERT触发器。

我想让他完成他的工作,但是当我坚持一个新的实体时,我得到了 SQL错误

An exception occurred while executing 'INSERT INTO SERVICE (CODE_SERVICE, DATE_CREATION, DATE_MODIFICATION) VALUES (?, ?, ?)' with params ["test", null, null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'DATE_CREATION' cannot be null

有办法做到这一点吗? 我知道触发器很糟糕,但我没有任何选择......

这是触发器,它有效:

    CREATE TRIGGER `SERVICE_BI_TG` BEFORE INSERT ON `SERVICE` FOR EACH ROW BEGIN
    BEGIN
        SET NEW.DATE_CREATION=NOW();
        SET NEW.DATE_MODIFICATION=NOW();
    END

问题是我在INSERT或UPDATE上设置了一些其他字段,比如一些外键和其他表上的一些UPDATE,我将其简化为我的帖子。

1 个答案:

答案 0 :(得分:2)

您不需要在数据库中为此定义触发器。

对于dateCreation,您可以在实体构造函数中初始化它:

public function __construct()
{
    $this->dateCreation = new \DateTime('now');
}

和dateModification一样,你需要在preUpdate事件上触发一个方法:

use Doctrine\ORM\Mapping as ORM;

/**
 *  @ORM\HasLifecycleCallbacks
 */
class myEntity{

    /**
     * @var \DateTime
     * @ORM\Column(name="date_modification", type="datetime")
     */
    private $this->dateModification;

    /**
     * @ORM\PreUpdate
     */
     public function incremenDateModification() {
         $this->dateModification = new \DateTime();
     }
}