8
9

More than 5 years have passed since last update.

[FuelPHP] ORMのObserver_Typingがすごい!

Last updated at Posted at 2014-12-08

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'>&nbsp;</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の使い所としては、テーブルのカラムにならないので、データベース側で利用しないデータ(補足情報など)のみ活用すると良いと思います。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9