Au cours d'un projet, j'ai eu à implémenter un système de verrouillage sur les objets d'une table. Ce verrouillage était réalisé avec la modification d'une colonne (locked_until) contenant un timestamp.

Le problème était que lorsque je mettais à jour cette colonne, le updated_at de mon objet était lui aussi mis à jour, ce qui est tout à fait normal.

J'ai donc essayé de trouver comment contourner la mise à jour du champ et j'ai finalement trouver ça :

  public function updateLock($userId)
  {
    $updatedAt = $this->getUpdatedAt();
    $this->setLockedUntil(time() + sfConfig::get('app_lock_delay'

));
    $this->setLockedBy($userId);
    $this->save();
    $this->setUpdatedAt($updatedAt);
    $this->save();
  }


On sauvegarde l'ancienne valeur de l'updated_at, puis on effectue les modifications sur l'objet et on sauvegarde. Ensuite (et voila l'astuce) il suffit de faire un appel à setUpdatedAt() et de sauvegarder à nouveau l'objet. Ainsi, la valeur n'aura pas changé !