Search code examples
symfonydoctrine-ormannotationsdoctrine

Doctrine keeps updating DATETIME on update CURRENT_TIMESTAMP


I have parent entity class:

namespace App\Model\Entities;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 */
abstract class ParentEntity
{
    /**
     * @var int|null
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;    

    /**
     * @ORM\Column(type="datetime", columnDefinition="DATETIME on update CURRENT_TIMESTAMP")
     */
    protected $modifiedOn;
}

and everytime I run php bin/console o:s:u --dump-sql or --force the console prints out that X queries will be executed and every query is for modified_on column.

 ALTER TABLE contact CHANGE modified_on modified_on DATETIME on update CURRENT_TIMESTAMP;
 ALTER TABLE about_us CHANGE modified_on modified_on DATETIME on update CURRENT_TIMESTAMP;
 ALTER TABLE image CHANGE modified_on modified_on DATETIME on update CURRENT_TIMESTAMP;
 ...

In MySQL database everything is setup correctly:

CREATE TABLE `about_us` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`modified_on` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

So my question is why is this happening? Did I miss some configuration/annotation for Doctrine? Or do you have to specify this attribute in some other way?


Solution

  • You are probably after Lifecycle Callbacks. if so this is the way to go:

    namespace App\Model\Entities;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\MappedSuperclass
     * @ORM\HasLifecycleCallbacks
     */
    abstract class ParentEntity
    {
        /**
         * @var int|null
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue
         */
        protected $id;    
    
        /**
         * @ORM\Column(type="datetime")
         */
        protected $modifiedOn;
    
        /**
         * @ORM\PreUpdate
         */
        public function setModifiedOn()
        {
            $this->modifiedOn = new \DateTime();
        }
    }