ORMのObserver_Typingについて簡単に説明すると、テーブルのカラムを増やさなくとも1つのカラムにシリアライズまたはJSONなどの文字列として保存することで、保存や取得を自動で行ってくれるものです。
例えばこのようなusersテーブルがあるとします。
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`profiles` text NOT NULL,
`created_at` int(11) DEFAULT NULL,
`updated_at` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
nameとprofilesというカラムがありますが、このprofilesの中に、ageとnicnameという2つの要素を保存してみたいと思います。
モデル(Model)
モデルでは、profilesのdata_typeを設定することと、$_observersにOrm\Observer_Typingを設定していきます。
<?php
use Orm\Model;
class Model_User extends Model
{
protected static $_properties = array(
'id',
'name',
'profiles' => array(
'data_type' => 'json',
),
'created_at',
'updated_at',
);
protected static $_observers = array(
'Orm\Observer_Typing' => array(
'events' => array('before_save', 'after_save', 'after_load')
),
'Orm\Observer_CreatedAt' => array(
'events' => array('before_insert'),
'mysql_timestamp' => false,
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_save'),
'mysql_timestamp' => false,
),
);
}
ビュー(View)
続いてビューではpostしたものが配列としてなるように書いていきます。
<?php echo Form::open(array("class"=>"form-horizontal")); ?>
<fieldset>
<div class="form-group">
<?php echo Form::label('Name', 'name', array('class'=>'control-label')); ?>
<?php echo Form::input('name', Input::post('name', isset($user) ? $user->name : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'Name')); ?>
</div>
<div class="form-group">
<?php echo Form::label('Age', 'age', array('class'=>'control-label')); ?>
<?php echo Form::input('profiles[age]', Input::post('profiles.age', isset($user->profiles) ? $user->profiles->age : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'age')); ?>
</div>
<div class="form-group">
<?php echo Form::label('Nicname', 'nicname', array('class'=>'control-label')); ?>
<?php echo Form::input('profiles[nicname]', Input::post('profiles.nicname', isset($user->profiles) ? $user->profiles->nicname : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'nicname')); ?>
</div>
<div class="form-group">
<label class='control-label'> </label>
<?php echo Form::submit('submit', 'Save', array('class' => 'btn btn-primary')); ?> </div>
</fieldset>
<?php echo Form::close(); ?>
'profiles[age]'のように書くことで、$post['profiles']['age']という形でpostされることになります。
コントローラー(Controller)
最後にコントローラーですが、ほとんど意識する必要ありません。保存する前に値をセットするときに配列になった形のままforgeの引数に渡せば、あとは勝手にJSONに直して保存してくれます。
$user = Model_User::forge(Input::post());
Typingの使い所としては、テーブルのカラムにならないので、データベース側で利用しないデータ(補足情報など)のみ活用すると良いと思います。