モデルのコールバックを利用し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;
}
}
}