環境: CakePHP 1.3
特定のフィールドの値をシリアライズしてから保存する Serializable ビヘイビアを作りました。配列などの構造を持つデータを、ひとつのフィールドに保存することができます。
serializable.php – gist
(いずれ正式なリポジトリに移すかもしれない)
fields オプションに指定したフィールドがsave時にJSONでエンコードして保存され、find時には自動的にデコードされます(PHP標準の serialize ではなくJSONを使用するのは互換性を重視しているため)。
var $actsAs = array('Serializable' => array('fields' => array('field1', 'field2'))); // 保存する前に自動的にJSONエンコードされる $Model->save(array( 'field1' => array(1,2,3), 'field2' => array('assoc' => 'data') )); // find時に自動でデコードされる $values = $Model->find('first'); // field1 == array(1,2,3) // field2 == array('assoc' => 'data')
この種のフィールド・シリアライズには様々なバリエーションが考えられます:
- JSON以外の形式でエンコードする
- 複数のフィールドの値をひとつにまとめて保存する
- シリアライズしたフィールドを別のモデルにマップして、hasOne関連のように扱えるようにする
このbehaviorは最も単純な作りになっているので、適当なメソッドを上書きすれば上のような動作も実現できるのではないかと思います。