Phalconモデルまとめ(3) 計量・ハイドレーションモード・新規作成と更新

「最速」PHPフレームワークPhalconのモデルについて、基本事項をまとめます(公式ドキュメントの翻訳+αです)。記事執筆時のPhalconのバージョンは1.3.1です。

モデルの計量

計量(集約)はデータベースの操作を助ける機能で、COUNT/SUM/MAX/MIN/AVGなどがあります。PhalconMvcModelでもこれらの機能を利用できます。

COUNTの例:

SUMの例:

AVERAGEの例:

MAX/MINの例:

ハイドレーションモード

Phalconのモデルの結果セットは、全てがオブジェクトです。DBの各行が単一のオブジェクトになっています。これらのオブジェクトに変更を加え、保存して永続化することができます。

結果セットの形式を変更するモードのことを、「ハイドレーションモード」といいます。

ハイドレーションモードは、find()のパラメーターとして渡すこともできます。

レコードの作成・更新

PhalconMvcModel::save() メソッドによって、レコードの作成・更新ができます。save()メソッドは内部でPhalconMvcModelのcreate()又はupdate()を呼びます。いずれのメソッドを呼ぶかは、エンティティの主キーが定義済みか否かによって決まります。

また、このメソッドは、同時にバリデーションも実行します。

全てのカラムに手動で代入する代わりに、save()に配列を渡すことができます。PhalconMvcModel は各カラムに定義済みのsetterが無いか確認します。

確実に作成・更新する

アプリケーションが同時に多くの利用者に利用されている時、レコードを新規作成すると予想していたのに実際には更新がされてしまうことがあります。PhalconMvcModel::save()を使用してDBへの永続化を行うと、このような現象が発生する可能性があります。もし、絶対にレコードが新規作成又は更新されるようにしたい場合、save()の代わりにcreate()又はupdate()を呼びます。

これらのメソッドには、save()と同様、配列をパラメータとして渡すことができます。

自動採番されるid

モデルがidを示すカラムをもつことがあります。これらのカラムはふつう、テーブルの主キーとして使用されます。PhalconMvcModelはidのカラムを認識することができます。そのため、PhalconMvcModelが生成するSQLのINSERT文には、idが含まれません(DBMSが自動採番できるようにするため)。レコードを新規作成した際には、DBMSによって採番されたidがモデルに登録されます。

PhalconMvcModelはidのカラムを認識することができます。DBMSの種類によりますが、PostgreSQLのようなSERIAL型のカラムであることもあれば、MySQLのようにauto_incrementが設定されたカラムである場合もあります。

関連テーブルの一括保存

マジックプロパティによって、あるレコードとその関連するプロパティを一度に保存することができます。

保存するレコードと、その関連レコードには、has-manyの関係があります。

アルバムとアーティストを同時に保存すると、暗黙的にトランザクションが使用されます。そのため、何らかの原因で関連レコードの保存に失敗した場合、親となるレコードも保存されません(内部的にエラーが発生します)。

注意点:以下のメソッドのオーバーロードによって関連するエンティティを追加しても、効果はありません。

  • PhalconMvcModel::beforeSave()
  • PhalconMvcModel::beforeCreate()
  • PhalconMvcModel::beforeUpdate()

もし、保存時の挙動を変更したいなら、PhalconMvcModel::save()をオーバーロード(※)する必要があります。

※:原文では「You need to overload PhalconMvcModel::save()」なのでそのまま訳しました。overrideの間違い?

今回はここまで

次回は、Validation Messagesから先、Phalconのモデルによるバリデーションの方法を紹介します。

コメントを残す