thomas.io

June 27, 2017

Désactiver la mise à jour automatique d’une colonne Timestamp dans Laravel

Lorsque vous créé une colonne timestamp dans votre base de données, à l’aide d’une migration Laravel comme ceci :

<?php

Schema::create(‘my_table’, function (Blueprint $table) {
    $table->increments('id');
    $table->timestamp(‘requested_at’);
});

Laravel utilise cette commande SQL :

CREATE TABLE `my_table` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `requested_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=900329 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Le problème, c’est qu’à chaque mise à jour de vos données, si vous ne spécifiez rien comme valeur pour requested_at, il va prendre le timestamp actuel : notez le ON UPDATE current_timestamp().

Pour éviter ça, il vous suffit de définir requested_at comme étant nullable (oui, même si cette colonne ne sera jamais vide).

<?php

Schema::create(‘my_table’, function (Blueprint $table) {
    $table->increments('id');
    $table->timestamp(‘requested_at’)->nullable();
});

Voila la requête SQL qui sera générée :

CREATE TABLE `my_table` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `requested_at` timestamp NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=900329 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Pour connaitre la requête SQL utilisée pour la création de la table :

SHOW CREATE TABLE my_table