cakePHPでカラムに入れる値をシリアライズしたりする

February 18, 2012,
tags: cakephp1.3 php


このエントリーをはてなブックマークに追加

cakePHPでカラムにシリアライズした値を入れたいときってたまにあると思います。
ただ、modelごととかメソッド毎にserialize/unserializeの処理をいれるのは結構めんどくさいと思います。

そんな時には以下のようにapp_modelに記述してあげれば、どのモデルからも簡単にシリアライズ処理が出来ると思います

class AppModel extends Model
{

    /**
     * 保存時にシリアライズするためのキーをしていする
     * @var array
     */
    var $serializeKey = array();


    function afterFind( $results ) {

        // シリアライズを行う
        if ( empty( $this->serializeKey ) ) {
            // シリアライズしない場合
            return $results;
        }

        foreach( $results as &$result ) {
            foreach( $this->serializeKey as $skey ) {
                if ( isset( $result[$this->alias][$skey] ) && !empty( $result[$this->alias][$skey] ) ) {
                    $result[$this->alias][$skey] = unserialize( $result[$this->alias][$skey] );
                }
            }
        }

        return $results;

    }


    function beforeSave() {

        // 保存前にシリアライズを行う
        if ( empty( $this->serializeKey ) ) {
            return true;
        }
        foreach( $this->serializeKey as $key => $value ) {
            if ( isset( $this->data[$this->alias][$value] ) ) {
                $this->data[$this->alias][$value] = serialize($this->data[$this->alias][$value]);
            }
        }
        return true;
    }

    function afterSave( $created ) {

        // 保存後にシリアライズを戻す
        if ( empty( $this->serializeKey ) ) {
            return;
        }

        foreach( $this->serializeKey as $key => $value ) {
            if ( isset( $this->data[$this->alias][$value] ) ) {
                $this->data[$this->alias][$value] = unserialize($this->data[$this->alias][$value]);
            }
        }
    }

}

あとは継承したモデルにserialize/unserializeしたいカラム名を指定すればおkです。

class Hoge extends AppModel
{
   var $serializeKey = array('data');
}

スキーマはこんな感じね。

 desc hoges
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| data       | mediumblob  | YES  | PRI | NULL    |                |
| created    | datetime    | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

以下のようにデータを入れてあげればさっくりとはいります

<?php
class HogeController extends AppController
{
    function edit() {
        $saveData = array(
            'id' => 1,
            'data'     => array(
                'name' => 'polidog',
                'age'    => 16,
            ),
        );

        $this->Hoge->save( $saveData , false);


        var_dump( $this->Hoge->read( null, 1) );
    }

}
comments powered by Disqus