This tutorial has a new version, check it out!

Adding createdAt and updatedAt Timestampable Fields

Keep on Learning!

If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.

Start your All-Access Pass
Buy just this tutorial for $12.00

Adding createdAt and updatedAt Timestampable Fields

Let’s do more magic! I always like to have createdAt and updatedAt fields on my database tables. A lot of times, this helps me debug any weird behavior I may see in the future.

The DoctrineExtensions library does this for us. It’s called timestampable, enable it in config.yml:

# app/config/config.yml
# ...

            sluggable: true
            timestampable: true

Head to the timestampable section of the documentation to see how this works. We already have the Gedmo annotation, so just copy in the created and updated properties and rename them to createdAt and updatedAt, just because I like those names better:

// src/Yoda/EventBundle/Entity/Event.php
// ...

 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
private $createdAt;

 * @Gedmo\Timestampable(on="update")
 * @ORM\Column(type="datetime")
private $updatedAt;

And now we’ll generate getter methods for these:

 * @return \DateTime
public function getCreatedAt()
    return $this->createdAt;

 * @return \DateTime
public function getUpdatedAt()
    return $this->updatedAt;

We can also add setter methods if we want, but we don’t need them: the library will set these for us!

Next, update the database schema to add the two new fields and then reload the fixtures:

php app/console doctrine:schema:update --force
php app/console doctrine:fixtures:load

Query for the events again:

php app/console doctrine:query:sql "SELECT * FROM yoda_event"

Nice! Both the createdAt and updatedAt columns are properly set. To avoid sadness and regret add these fields to almost every table.

Leave a comment!

What PHP libraries does this tutorial use?

// composer.json
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "~2.4", // v2.4.2
        "doctrine/orm": "~2.2,>=2.2.3", // v2.4.2
        "doctrine/doctrine-bundle": "~1.2", // v1.2.0
        "twig/extensions": "~1.0", // v1.0.1
        "symfony/assetic-bundle": "~2.3", // v2.3.0
        "symfony/swiftmailer-bundle": "~2.3", // v2.3.5
        "symfony/monolog-bundle": "~2.4", // v2.5.0
        "sensio/distribution-bundle": "~2.3", // v2.3.4
        "sensio/framework-extra-bundle": "~3.0", // v3.0.0
        "sensio/generator-bundle": "~2.3", // v2.3.4
        "incenteev/composer-parameter-handler": "~2.0", // v2.1.0
        "doctrine/doctrine-fixtures-bundle": "~2.2.0", // v2.2.0
        "ircmaxell/password-compat": "~1.0.3", // 1.0.3
        "phpunit/phpunit": "~4.1", // 4.1.0
        "stof/doctrine-extensions-bundle": "~1.1.0" // v1.1.0