コールバックを利用し保存時に作成/更新日時を格納する | Tips

モデルのコールバックを利用しINSERT時に created_at に現在時刻を、UPDATE時に updated_at に現在時刻を格納することができます。

複数のモデルに適用させるとし、まず基底クラスを作成します。
app/models/BaseModel.php

class BaseModel extends Sabel_Db_Model
{
  public function beforeInsert($method)
  {
    
  }
  
  public function beforeUpdate($method)
  {
    
  }
}
beforeInsert の実装をします。実装は単純で created_at に値が入ってなければ現在時刻を格納するだけです。
public function beforeInsert($method)
{
  if (!isset($this->values["created_at"])) {
    $this->values["created_at"] = now();
  }
}
beforeUpdate の実装も同様、updated_at に現在時刻を格納します。
public function beforeUpdate($method)
{
  if (!isset($this->updateValues["updated_at"])) {
    $this->updateValues["updated_at"] = now();
  }
}
この仕組みを適用するモデルに、この BaseModelクラス を継承させます。
app/models/Mymodel.php

class MyModel extends BaseModel
{
  
}
これで MyModel はINSERT時に created_at を省略すれば自動で created_at に現在時刻が、UPDATE時に updated_at を省略すれば自動で updated_at に現在時刻が格納されるようになりました。アプリケーションによってはINSERT時に updated_at にも現在時刻を格納したいかもしれません。
その場合は beforeInsert を下記のように変更するだけです。
public function beforeInsert($method)
{
  $now = now();
  
  if (!isset($this->values["created_at"])) {
    $this->values["created_at"] = $now;
  }
  
  if (!isset($this->values["updated_at"])) {
    $this->values["updated_at"] = $now;
  }
}
また、全てのモデルがこの BaseModel を継承する場合、モデルによっては created_at や updated_at というカラムが無いかもしれません。そのような場合は、下記のようにカラムが存在するかどうかのチェックコードを入れてください。
public function beforeInsert($method)
{
  $now = now();
  
  if (isset($this->metaCols["created_at"])) {
    if (!isset($this->values["created_at"])) {
      $this->values["created_at"] = $now;
    }
  }
  
  if (isset($this->metaCols["updated_at"])) {
    if (!isset($this->values["updated_at"])) {
      $this->values["updated_at"] = $now;
    }
  }
}